-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7480b94
commit 8209530
Showing
1 changed file
with
106 additions
and
0 deletions.
There are no files selected for viewing
106 changes: 106 additions & 0 deletions
106
patches/server/0731-Add-System.out.println-catcher.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: underscore11code <minecrafter11mrt@gmail.com> | ||
Date: Fri, 23 Jul 2021 23:01:42 -0700 | ||
Subject: [PATCH] Add System.out.println catcher | ||
|
||
|
||
diff --git a/src/main/java/io/papermc/paper/logging/SysoutCatcher.java b/src/main/java/io/papermc/paper/logging/SysoutCatcher.java | ||
new file mode 100644 | ||
index 0000000000000000000000000000000000000000..b55228f1e5f3fed43f19e83dbdf77e93258c4cd8 | ||
--- /dev/null | ||
+++ b/src/main/java/io/papermc/paper/logging/SysoutCatcher.java | ||
@@ -0,0 +1,74 @@ | ||
+package io.papermc.paper.logging; | ||
+ | ||
+import com.google.common.collect.ImmutableSet; | ||
+import org.apache.commons.lang.StringUtils; | ||
+import org.bukkit.Bukkit; | ||
+import org.bukkit.plugin.Plugin; | ||
+import org.bukkit.plugin.java.JavaPlugin; | ||
+ | ||
+import java.io.PrintStream; | ||
+import java.util.Set; | ||
+ | ||
+public final class SysoutCatcher { | ||
+ private static final String OUT_PREFIX = "[STDOUT] "; | ||
+ private static final String ERR_PREFIX = "[STDERR] "; | ||
+ private final StackWalker stackWalker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); | ||
+ private final Set<String> blacklistedPlugins; | ||
+ | ||
+ public SysoutCatcher() { | ||
+ final String rawBlacklist = System.getProperty("io.papermc.paper.suppress.sout.nags"); | ||
+ if (StringUtils.isNotBlank(rawBlacklist)) { | ||
+ blacklistedPlugins = ImmutableSet.<String>builder().add(rawBlacklist.split(",")).build(); | ||
+ } else blacklistedPlugins = ImmutableSet.of(); | ||
+ | ||
+ // Listen to System.out.println | ||
+ PrintStream wrappedOut = new PrintStream(System.out) { | ||
+ @Override | ||
+ public void println(String line) { | ||
+ Class<?> clazz = stackWalker.getCallerClass(); | ||
+ try { | ||
+ JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz); | ||
+ | ||
+ // Instead of just printing the message, send it to the plugin's logger | ||
+ plugin.getLogger().info(OUT_PREFIX + line); | ||
+ nag(plugin); | ||
+ } catch (IllegalArgumentException e) { | ||
+ // 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 | ||
+ Bukkit.getLogger().info(String.format("[%s] %s %s", OUT_PREFIX, clazz.getName(), line)); | ||
+ } | ||
+ } | ||
+ }; | ||
+ | ||
+ // Listen to System.err.println | ||
+ PrintStream wrappedErr = new PrintStream(System.err) { | ||
+ @Override | ||
+ public void println(String line) { | ||
+ Class<?> clazz = stackWalker.getCallerClass(); | ||
+ try { | ||
+ JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz); | ||
+ | ||
+ // Instead of just printing the message, send it to the plugin's logger | ||
+ plugin.getLogger().severe(ERR_PREFIX + line); | ||
+ nag(plugin); | ||
+ } catch (IllegalArgumentException e) { | ||
+ // 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 | ||
+ Bukkit.getLogger().info(String.format("[%s] %s %s", ERR_PREFIX, clazz.getName(), line)); | ||
+ } | ||
+ } | ||
+ }; | ||
+ | ||
+ // Set the two PrintStreams so they're used | ||
+ System.setOut(wrappedOut); | ||
+ System.setErr(wrappedErr); | ||
+ } | ||
+ | ||
+ private void nag(Plugin plugin) { | ||
+ if (this.blacklistedPlugins.contains(plugin.getName())) return; | ||
+ Bukkit.getLogger().warning(String.format("Nag author(s): '%s' of '%s' about their usage of System.out/err.print. " + | ||
+ "Please use your plugin's logger instead (JavaPlugin#getLogger).", | ||
+ plugin.getDescription().getAuthors(), | ||
+ plugin.getName())); | ||
+ } | ||
+} | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
index 9954e45c32a4b6d80fe912ed9d55cd4fc8c4e98b..6d7f16fede01c19f638e1dcdae8b07b79cd86dc0 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
@@ -18,6 +18,7 @@ import com.mojang.serialization.Lifecycle; | ||
import io.netty.buffer.ByteBuf; | ||
import io.netty.buffer.ByteBufOutputStream; | ||
import io.netty.buffer.Unpooled; | ||
+import io.papermc.paper.logging.SysoutCatcher; | ||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; | ||
import java.awt.image.BufferedImage; | ||
import java.io.File; | ||
@@ -277,6 +278,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 | ||
|
||
static { | ||
ConfigurationSerialization.registerClass(CraftOfflinePlayer.class); |