From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Mon, 28 Jun 2021 13:33:12 -0500 Subject: [PATCH] Redirect System.out calls to plugin loggers diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index 455776981274e64724376a3182b60784b56db9cf..cd859eec6b0bee44bce83614e55709381baf5e6b 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -176,8 +176,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface */ // Paper end - System.setOut(IoBuilder.forLogger(logger).setLevel(Level.INFO).buildPrintStream()); - System.setErr(IoBuilder.forLogger(logger).setLevel(Level.WARN).buildPrintStream()); + System.setOut(new org.purpurmc.purpur.PurpurPrintStream(IoBuilder.forLogger(logger).setLevel(Level.INFO).buildPrintStream(), java.util.logging.Logger::info)); // Purpur + System.setErr(new org.purpurmc.purpur.PurpurPrintStream(IoBuilder.forLogger(logger).setLevel(Level.WARN).buildPrintStream(), java.util.logging.Logger::severe)); // Purpur // CraftBukkit end thread.setDaemon(true); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 55baa26e2938ad8cb04a3b5f468db6ebea28b1ff..a8e037522300f3c9ba455f5ea505d0f375e3e39d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -295,7 +295,7 @@ public final class CraftServer implements Server { public int reloadCount; private final io.papermc.paper.datapack.PaperDatapackManager datapackManager; // Paper public static Exception excessiveVelEx; // Paper - Velocity warnings - private final SysoutCatcher sysoutCatcher = new SysoutCatcher(); // Paper + //private final SysoutCatcher sysoutCatcher = new SysoutCatcher(); // Paper // Purpur - we have our own implementation that doesnt nag or prefix output static { ConfigurationSerialization.registerClass(CraftOfflinePlayer.class); diff --git a/src/main/java/org/purpurmc/purpur/PurpurPrintStream.java b/src/main/java/org/purpurmc/purpur/PurpurPrintStream.java new file mode 100644 index 0000000000000000000000000000000000000000..f39c451f8877c7cb66fd4761006176107eceeac6 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurPrintStream.java @@ -0,0 +1,65 @@ +/* + * MIT License + * + * Copyright (c) 2020 Josh (Vicarious) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.purpurmc.purpur; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.function.BiConsumer; +import java.util.logging.Logger; + +/** + * Logic borrowed from SysoutCatcher + *

+ * https://www.spigotmc.org/resources/sysoutcatcher.79076/ + */ + +public class PurpurPrintStream extends PrintStream { + private static final StackWalker STACKWALKER = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + private final BiConsumer consumer; + + public PurpurPrintStream(@NotNull OutputStream out, BiConsumer consumer) { + super(out); + this.consumer = consumer; + } + + @Override + public void println(String line) { + try { + // Get the JavaPlugin that "owns" the calling class + JavaPlugin plugin = JavaPlugin.getProvidingPlugin(STACKWALKER.getCallerClass()); + + // Instead of just printing the message, send it to the plugin's logger + consumer.accept(plugin.getLogger(), line); + } catch (Throwable ignore) { + // If anything happens, the calling class doesn't exist, there is no JavaPlugin that "owns" the calling class, etc + // Just print out normally, with some added information + StackTraceElement element = Thread.currentThread().getStackTrace()[2]; + consumer.accept(Bukkit.getLogger(), String.format("(%s:%d) %s", element.getClassName(), element.getLineNumber(), line)); + } + } +}