From 10893fea38179942f6028be150fba3b823a9b1d1 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Mon, 18 Sep 2017 12:07:47 +0200 Subject: [PATCH 1/5] Use Log4j IOStreams to redirect System.out/err to logger Log4j2 provides an optimized implementation of PrintStream that redirects its output to a logger. Use it instead of a custom implementation for minor performance improvements and some fixes. With the old implementation, each call to System.print() results in a separate line, even though it should not result in a line break. Log4j's implementation handles it correctly. --- ...ams-to-redirect-System.out-err-to-lo.patch | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Spigot-Server-Patches/0238-Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch diff --git a/Spigot-Server-Patches/0238-Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch b/Spigot-Server-Patches/0238-Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch new file mode 100644 index 0000000000..b504df2b29 --- /dev/null +++ b/Spigot-Server-Patches/0238-Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch @@ -0,0 +1,51 @@ +From a7ced92f0d09b6e25e5c66dc24db2da45f3341f7 Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Mon, 18 Sep 2017 12:00:03 +0200 +Subject: [PATCH] Use Log4j IOStreams to redirect System.out/err to logger + +Log4j2 provides an optimized implementation of PrintStream that +redirects its output to a logger. Use it instead of a custom +implementation for minor performance improvements and some fixes. + +With the old implementation, each call to System.print() +results in a separate line, even though it should not result in +a line break. Log4j's implementation handles it correctly. + +diff --git a/pom.xml b/pom.xml +index 98972114d..aff997468 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -97,6 +97,13 @@ + runtime + + ++ ++ ++ org.apache.logging.log4j ++ log4j-iostreams ++ 2.8.1 ++ ++ + + + junit +diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java +index b3f1aa999..854455711 100644 +--- a/src/main/java/net/minecraft/server/DedicatedServer.java ++++ b/src/main/java/net/minecraft/server/DedicatedServer.java +@@ -129,8 +129,10 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer + */ + // Paper end + +- System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true)); +- System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true)); ++ // Paper start - Use Log4j IOStreams ++ System.setOut(org.apache.logging.log4j.io.IoBuilder.forLogger(logger).setLevel(Level.INFO).buildPrintStream()); ++ System.setErr(org.apache.logging.log4j.io.IoBuilder.forLogger(logger).setLevel(Level.WARN).buildPrintStream()); ++ // Paper end + // CraftBukkit end + + thread.setDaemon(true); +-- +2.14.1 + From bbfc0c8ee3442856f9dd849751f557c8864db947 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Thu, 21 Sep 2017 16:18:30 +0200 Subject: [PATCH 2/5] Handle plugin prefixes in Log4j configuration --- ...efixes-in-implementation-logging-con.patch | 44 +++++++++++ ...n-prefixes-using-Log4J-configuration.patch | 74 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 Spigot-API-Patches/0067-Handle-plugin-prefixes-in-implementation-logging-con.patch create mode 100644 Spigot-Server-Patches/0239-Handle-plugin-prefixes-using-Log4J-configuration.patch diff --git a/Spigot-API-Patches/0067-Handle-plugin-prefixes-in-implementation-logging-con.patch b/Spigot-API-Patches/0067-Handle-plugin-prefixes-in-implementation-logging-con.patch new file mode 100644 index 0000000000..86a6807125 --- /dev/null +++ b/Spigot-API-Patches/0067-Handle-plugin-prefixes-in-implementation-logging-con.patch @@ -0,0 +1,44 @@ +From 862e7c3bc002483f3d98c7f24ea0e06d6575a3eb Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Thu, 21 Sep 2017 16:14:13 +0200 +Subject: [PATCH] Handle plugin prefixes in implementation logging + configuration + +Currently, plugin prefixes are prepended to the log message in +the PluginLogger before passing the message to the underlying +logging framework. This is bad design because they need to be +stripped manually when using custom appenders to log messages +in a different format. + +Additionally, it makes integration of alternative logging APIs hard +because all logging must go through the PluginLogger. Avoid using +PluginLogger and create a regular logger using the plugin name. +The implementation should handle plugin prefixes by displaying +logger names when appropriate. + +diff --git a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java +index 16b1eb37..0abad9ad 100644 +--- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java ++++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java +@@ -50,7 +50,7 @@ public abstract class JavaPlugin extends PluginBase { + private boolean naggable = true; + private FileConfiguration newConfig = null; + private File configFile = null; +- private PluginLogger logger = null; ++ private Logger logger = null; // Paper - PluginLogger -> Logger + + public JavaPlugin() { + final ClassLoader classLoader = this.getClass().getClassLoader(); +@@ -277,7 +277,8 @@ public abstract class JavaPlugin extends PluginBase { + this.dataFolder = dataFolder; + this.classLoader = classLoader; + this.configFile = new File(dataFolder, "config.yml"); +- this.logger = new PluginLogger(this); ++ // Paper - Handle plugin prefix in implementation ++ this.logger = Logger.getLogger(description.getPrefix() != null ? description.getPrefix() : description.getName()); + } + + /** +-- +2.14.1 + diff --git a/Spigot-Server-Patches/0239-Handle-plugin-prefixes-using-Log4J-configuration.patch b/Spigot-Server-Patches/0239-Handle-plugin-prefixes-using-Log4J-configuration.patch new file mode 100644 index 0000000000..cb65865be6 --- /dev/null +++ b/Spigot-Server-Patches/0239-Handle-plugin-prefixes-using-Log4J-configuration.patch @@ -0,0 +1,74 @@ +From c5fa4d29b7cf19517b522dc34ce0d3c3aec40b04 Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Thu, 21 Sep 2017 16:14:55 +0200 +Subject: [PATCH] Handle plugin prefixes using Log4J configuration + +Display logger name in the console for all loggers except the +root logger, Bukkit's logger ("Minecraft") and Minecraft loggers. +Since plugins now use the plugin name as logger name this will +restore the plugin prefixes without having to prepend them manually +to the log messages. + +Logger prefixes are shown by default for all loggers except for +the root logger, the Minecraft/Mojang loggers and the Bukkit loggers. +This may cause additional prefixes to be disabled for plugins bypassing +the plugin logger. + +diff --git a/pom.xml b/pom.xml +index aff997468..dfb006aa0 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -94,7 +94,7 @@ + org.apache.logging.log4j + log4j-core + 2.8.1 +- runtime ++ compile + + + +diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java +index 712fc1f9b..b5bfb15fa 100644 +--- a/src/main/java/org/spigotmc/SpigotConfig.java ++++ b/src/main/java/org/spigotmc/SpigotConfig.java +@@ -282,7 +282,7 @@ public class SpigotConfig + private static void playerSample() + { + playerSample = getInt( "settings.sample-count", 12 ); +- System.out.println( "Server Ping Player Sample Count: " + playerSample ); ++ Bukkit.getLogger().log( Level.INFO, "Server Ping Player Sample Count: {0}", playerSample ); // Paper - Use logger + } + + public static int playerShuffle; +diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml +index 08b6bb7f9..9f8334376 100644 +--- a/src/main/resources/log4j2.xml ++++ b/src/main/resources/log4j2.xml +@@ -2,10 +2,22 @@ + + + +- ++ ++ ++ ++ ++ ++ + + +- ++ ++ ++ ++ ++ ++ + + + +-- +2.14.1 + From ce34fd1ade2a0388034b2f93b5c2615c1ee61e30 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Thu, 21 Sep 2017 16:34:36 +0200 Subject: [PATCH 3/5] Allow plugins to use SLF4J for logging SLF4J is a commonly used abstraction for various logging frameworks such as java.util.logging (JUL) or Log4j. Currently, plugins are required to do all their logging using the provided JUL logger. This is annoying for plugins that target multiple platforms or when using libraries that log messages using SLF4J. Expose SLF4J as optional logging API for plugins, so they can use it without having to shade it in the plugin and going through several layers of logging abstraction. --- ...low-plugins-to-use-SLF4J-for-logging.patch | 54 +++++++++++++++++++ ...-Include-Log4J2-SLF4J-implementation.patch | 26 +++++++++ 2 files changed, 80 insertions(+) create mode 100644 Spigot-API-Patches/0068-Allow-plugins-to-use-SLF4J-for-logging.patch create mode 100644 Spigot-Server-Patches/0240-Include-Log4J2-SLF4J-implementation.patch diff --git a/Spigot-API-Patches/0068-Allow-plugins-to-use-SLF4J-for-logging.patch b/Spigot-API-Patches/0068-Allow-plugins-to-use-SLF4J-for-logging.patch new file mode 100644 index 0000000000..b1300dd0c8 --- /dev/null +++ b/Spigot-API-Patches/0068-Allow-plugins-to-use-SLF4J-for-logging.patch @@ -0,0 +1,54 @@ +From fd9c40f3f333eab91c410c02c20b7b9f7c64ebf2 Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Thu, 21 Sep 2017 16:33:12 +0200 +Subject: [PATCH] Allow plugins to use SLF4J for logging + +SLF4J is a commonly used abstraction for various logging frameworks +such as java.util.logging (JUL) or Log4j. Currently, plugins are +required to do all their logging using the provided JUL logger. +This is annoying for plugins that target multiple platforms or when +using libraries that log messages using SLF4J. + +Expose SLF4J as optional logging API for plugins, so they can use +it without having to shade it in the plugin and going through +several layers of logging abstraction. + +diff --git a/pom.xml b/pom.xml +index ad385f45..b83c6eb1 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -122,6 +122,14 @@ + compile + + ++ ++ ++ org.slf4j ++ slf4j-api ++ 1.7.25 ++ compile ++ ++ + + + junit +diff --git a/src/main/java/org/bukkit/plugin/Plugin.java b/src/main/java/org/bukkit/plugin/Plugin.java +index c4e22c62..02670254 100644 +--- a/src/main/java/org/bukkit/plugin/Plugin.java ++++ b/src/main/java/org/bukkit/plugin/Plugin.java +@@ -157,6 +157,12 @@ public interface Plugin extends TabExecutor { + */ + public Logger getLogger(); + ++ // Paper start - Add SLF4J logger ++ default org.slf4j.Logger getSLF4JLogger() { ++ return org.slf4j.LoggerFactory.getLogger(getLogger().getName()); ++ } ++ // Paper end ++ + /** + * Returns the name of the plugin. + *

+-- +2.14.1 + diff --git a/Spigot-Server-Patches/0240-Include-Log4J2-SLF4J-implementation.patch b/Spigot-Server-Patches/0240-Include-Log4J2-SLF4J-implementation.patch new file mode 100644 index 0000000000..2c01e2e79d --- /dev/null +++ b/Spigot-Server-Patches/0240-Include-Log4J2-SLF4J-implementation.patch @@ -0,0 +1,26 @@ +From e4b022439652ed4b044c10cadb7525671bcd54f3 Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Thu, 21 Sep 2017 16:33:35 +0200 +Subject: [PATCH] Include Log4J2 SLF4J implementation + + +diff --git a/pom.xml b/pom.xml +index fa726851b..647b2c619 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -98,6 +98,12 @@ + + + ++ ++ org.apache.logging.log4j ++ log4j-slf4j-impl ++ 2.8.1 ++ runtime ++ + + org.apache.logging.log4j + log4j-iostreams +-- +2.14.1 + From 5a3fb946d8b66c21894c7b6e72227e3512f3c009 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Thu, 21 Sep 2017 19:44:24 +0200 Subject: [PATCH 4/5] Add workaround for plugins modifying the parent of the plugin logger Essentials uses a custom logger name ("Essentials") instead of the plugin logger. Log messages are redirected to the plugin logger by setting the parent of the "Essentials" logger to the plugin logger. With our changes, the plugin logger is now also called "Essentials", resulting in an infinite loop. Make sure plugins can't change the parent of the plugin logger to avoid this. --- ...or-plugins-modifying-the-parent-of-t.patch | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Spigot-API-Patches/0069-Add-workaround-for-plugins-modifying-the-parent-of-t.patch diff --git a/Spigot-API-Patches/0069-Add-workaround-for-plugins-modifying-the-parent-of-t.patch b/Spigot-API-Patches/0069-Add-workaround-for-plugins-modifying-the-parent-of-t.patch new file mode 100644 index 0000000000..b4a7b0715a --- /dev/null +++ b/Spigot-API-Patches/0069-Add-workaround-for-plugins-modifying-the-parent-of-t.patch @@ -0,0 +1,63 @@ +From a308504bd0a184f8e568e063143a3df4ec10fefb Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Thu, 21 Sep 2017 19:41:20 +0200 +Subject: [PATCH] Add workaround for plugins modifying the parent of the plugin + logger + +Essentials uses a custom logger name ("Essentials") instead of the +plugin logger. Log messages are redirected to the plugin logger by +setting the parent of the "Essentials" logger to the plugin logger. + +With our changes, the plugin logger is now also called "Essentials", +resulting in an infinite loop. Make sure plugins can't change the +parent of the plugin logger to avoid this. + +diff --git a/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java b/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java +new file mode 100644 +index 00000000..1c93cf30 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java +@@ -0,0 +1,27 @@ ++package com.destroystokyo.paper.utils; ++ ++import org.bukkit.plugin.PluginDescriptionFile; ++ ++import java.util.logging.LogManager; ++import java.util.logging.Logger; ++ ++/** ++ * Prevents plugins (e.g. Essentials) from changing the parent of the plugin logger. ++ */ ++public class PaperPluginLogger extends Logger { ++ ++ public PaperPluginLogger(PluginDescriptionFile description) { ++ super(description.getPrefix() != null ? description.getPrefix() : description.getName(), null); ++ LogManager.getLogManager().addLogger(this); ++ } ++ ++ @Override ++ public void setParent(Logger parent) { ++ if (getParent() != null) { ++ warning("Ignoring attempt to change parent of plugin logger"); ++ } else { ++ super.setParent(parent); ++ } ++ } ++ ++} +diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +index b2cbf9e4..7a95239a 100644 +--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +@@ -59,6 +59,8 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot + this.dataFolder = dataFolder; + this.file = file; + ++ new com.destroystokyo.paper.utils.PaperPluginLogger(description); // Paper - Register logger early ++ + try { + Class jarClass; + try { +-- +2.14.1 + From a4ed512a939ec1884cf93234f874e4ec957bcfa7 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Fri, 22 Sep 2017 09:47:01 +0200 Subject: [PATCH 5/5] Disable logger prefix for various plugins bypassing the plugin logger Some plugins bypass the plugin logger and add the plugin prefix manually to the log message. Since they use other logger names (e.g. qualified class names) these would now also appear in the log. Disable the logger prefix for these plugins so the messages show up correctly. --- ...refix-for-various-plugins-bypassing-.patch | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Spigot-Server-Patches/0241-Disable-logger-prefix-for-various-plugins-bypassing-.patch diff --git a/Spigot-Server-Patches/0241-Disable-logger-prefix-for-various-plugins-bypassing-.patch b/Spigot-Server-Patches/0241-Disable-logger-prefix-for-various-plugins-bypassing-.patch new file mode 100644 index 0000000000..8218f7770c --- /dev/null +++ b/Spigot-Server-Patches/0241-Disable-logger-prefix-for-various-plugins-bypassing-.patch @@ -0,0 +1,39 @@ +From 8f6662b78aa50b814c65312928337c13e61d2de7 Mon Sep 17 00:00:00 2001 +From: Minecrell +Date: Sat, 23 Sep 2017 21:07:20 +0200 +Subject: [PATCH] Disable logger prefix for various plugins bypassing the + plugin logger + +Some plugins bypass the plugin logger and add the plugin prefix +manually to the log message. Since they use other logger names +(e.g. qualified class names) these would now also appear in the +log. Disable the logger prefix for these plugins so the messages +show up correctly. + +diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml +index 9f8334376..6711e6dff 100644 +--- a/src/main/resources/log4j2.xml ++++ b/src/main/resources/log4j2.xml +@@ -5,7 +5,8 @@ + + + +- ++ + + +@@ -14,7 +15,8 @@ + + + +- ++ + + +-- +2.14.1 +