Skip to content

Commit

Permalink
Add System.out.println catcher
Browse files Browse the repository at this point in the history
  • Loading branch information
underscore11code committed Jul 29, 2021
1 parent 7480b94 commit 8209530
Showing 1 changed file with 106 additions and 0 deletions.
106 changes: 106 additions & 0 deletions patches/server/0731-Add-System.out.println-catcher.patch
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);

0 comments on commit 8209530

Please sign in to comment.