From 8556beee8c2c9b73e343c42a5ac04865a2bc0abb 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 | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Spigot-Server-Patches/Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch diff --git a/Spigot-Server-Patches/Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch b/Spigot-Server-Patches/Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch new file mode 100644 index 0000000000..737d8db26d --- /dev/null +++ b/Spigot-Server-Patches/Use-Log4j-IOStreams-to-redirect-System.out-err-to-lo.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 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 +@@ -0,0 +0,0 @@ + 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 +@@ -0,0 +0,0 @@ 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); +-- \ No newline at end of file From 57d987e936f35ab810531415d53696872ec8f710 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 | 42 +++++++++++ ...n-prefixes-using-Log4J-configuration.patch | 72 +++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 Spigot-API-Patches/Handle-plugin-prefixes-in-implementation-logging-con.patch create mode 100644 Spigot-Server-Patches/Handle-plugin-prefixes-using-Log4J-configuration.patch diff --git a/Spigot-API-Patches/Handle-plugin-prefixes-in-implementation-logging-con.patch b/Spigot-API-Patches/Handle-plugin-prefixes-in-implementation-logging-con.patch new file mode 100644 index 0000000000..1c64facbb4 --- /dev/null +++ b/Spigot-API-Patches/Handle-plugin-prefixes-in-implementation-logging-con.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 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 +@@ -0,0 +0,0 @@ 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(); +@@ -0,0 +0,0 @@ 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()); + } + + /** +-- \ No newline at end of file diff --git a/Spigot-Server-Patches/Handle-plugin-prefixes-using-Log4J-configuration.patch b/Spigot-Server-Patches/Handle-plugin-prefixes-using-Log4J-configuration.patch new file mode 100644 index 0000000000..723877cf53 --- /dev/null +++ b/Spigot-Server-Patches/Handle-plugin-prefixes-using-Log4J-configuration.patch @@ -0,0 +1,72 @@ +From 0000000000000000000000000000000000000000 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 +@@ -0,0 +0,0 @@ + 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 +@@ -0,0 +0,0 @@ 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 +@@ -0,0 +0,0 @@ + + + +- ++ ++ ++ ++ ++ ++ + + +- ++ ++ ++ ++ ++ ++ + + + +-- \ No newline at end of file From a64c8c70daaa635ac74270ef7e3de02f3d58d61b 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 | 52 +++++++++++++++++++ .../Include-Log4J2-SLF4J-implementation.patch | 24 +++++++++ 2 files changed, 76 insertions(+) create mode 100644 Spigot-API-Patches/Allow-plugins-to-use-SLF4J-for-logging.patch create mode 100644 Spigot-Server-Patches/Include-Log4J2-SLF4J-implementation.patch diff --git a/Spigot-API-Patches/Allow-plugins-to-use-SLF4J-for-logging.patch b/Spigot-API-Patches/Allow-plugins-to-use-SLF4J-for-logging.patch new file mode 100644 index 0000000000..2e70b7dedb --- /dev/null +++ b/Spigot-API-Patches/Allow-plugins-to-use-SLF4J-for-logging.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 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 +@@ -0,0 +0,0 @@ + 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 +@@ -0,0 +0,0 @@ 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. + *

+-- \ No newline at end of file diff --git a/Spigot-Server-Patches/Include-Log4J2-SLF4J-implementation.patch b/Spigot-Server-Patches/Include-Log4J2-SLF4J-implementation.patch new file mode 100644 index 0000000000..5624297df8 --- /dev/null +++ b/Spigot-Server-Patches/Include-Log4J2-SLF4J-implementation.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 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 +@@ -0,0 +0,0 @@ + + + ++ ++ org.apache.logging.log4j ++ log4j-slf4j-impl ++ 2.8.1 ++ runtime ++ + + org.apache.logging.log4j + log4j-iostreams +-- \ No newline at end of file From 241a26404611e5988ff55f1ea3fc97214f715876 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 | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Spigot-API-Patches/Add-workaround-for-plugins-modifying-the-parent-of-t.patch diff --git a/Spigot-API-Patches/Add-workaround-for-plugins-modifying-the-parent-of-t.patch b/Spigot-API-Patches/Add-workaround-for-plugins-modifying-the-parent-of-t.patch new file mode 100644 index 0000000000..a707595f68 --- /dev/null +++ b/Spigot-API-Patches/Add-workaround-for-plugins-modifying-the-parent-of-t.patch @@ -0,0 +1,61 @@ +From 0000000000000000000000000000000000000000 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 +0,0 @@ ++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 +@@ -0,0 +0,0 @@ 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 { +-- \ No newline at end of file From c4553b39361535094e38139cb250402b61f16b2b 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 | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Spigot-Server-Patches/Disable-logger-prefix-for-various-plugins-bypassing-.patch diff --git a/Spigot-Server-Patches/Disable-logger-prefix-for-various-plugins-bypassing-.patch b/Spigot-Server-Patches/Disable-logger-prefix-for-various-plugins-bypassing-.patch new file mode 100644 index 0000000000..6ff9d880de --- /dev/null +++ b/Spigot-Server-Patches/Disable-logger-prefix-for-various-plugins-bypassing-.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 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 +@@ -0,0 +0,0 @@ + + + +- ++ + + +@@ -0,0 +0,0 @@ + + + +- ++ + + +-- \ No newline at end of file