mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-10-07 02:47:28 +02:00
57c175ce7f
updates log4j from 2.12 to 1.14, this includes a fix for systems with a broken mac address which can cause the proxy to not start on such broken machines
463 lines
17 KiB
Diff
463 lines
17 KiB
Diff
From 4c550fb65f1bcf822f8f391688d7a669a51aab28 Mon Sep 17 00:00:00 2001
|
|
From: Minecrell <minecrell@minecrell.net>
|
|
Date: Fri, 22 Sep 2017 12:46:47 +0200
|
|
Subject: [PATCH] Use Log4j2 for logging and TerminalConsoleAppender for
|
|
console
|
|
|
|
|
|
diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml
|
|
index 1bea329d..37c0880c 100644
|
|
--- a/bootstrap/pom.xml
|
|
+++ b/bootstrap/pom.xml
|
|
@@ -49,6 +49,9 @@
|
|
<Main-Class>net.md_5.bungee.Bootstrap</Main-Class>
|
|
<Implementation-Version>${describe}</Implementation-Version>
|
|
<Specification-Version>${maven.build.timestamp}</Specification-Version>
|
|
+
|
|
+ <!-- Log4j includes custom classes for Java 9+ (#293) -->
|
|
+ <Multi-Release>true</Multi-Release>
|
|
</manifestEntries>
|
|
</archive>
|
|
</configuration>
|
|
@@ -76,7 +79,17 @@
|
|
</excludes>
|
|
</filter>
|
|
</filters>
|
|
+ <transformers>
|
|
+ <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer" />
|
|
+ </transformers>
|
|
</configuration>
|
|
+ <dependencies>
|
|
+ <dependency>
|
|
+ <groupId>com.github.edwgiz</groupId>
|
|
+ <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
|
|
+ <version>2.13.2</version>
|
|
+ </dependency>
|
|
+ </dependencies>
|
|
</plugin>
|
|
</plugins>
|
|
</build>
|
|
diff --git a/log4j/pom.xml b/log4j/pom.xml
|
|
new file mode 100644
|
|
index 00000000..84039f14
|
|
--- /dev/null
|
|
+++ b/log4j/pom.xml
|
|
@@ -0,0 +1,48 @@
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+ <modelVersion>4.0.0</modelVersion>
|
|
+
|
|
+ <parent>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>waterfall-parent</artifactId>
|
|
+ <version>1.16-R0.5-SNAPSHOT</version>
|
|
+ <relativePath>../pom.xml</relativePath>
|
|
+ </parent>
|
|
+
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>waterfall-log4j</artifactId>
|
|
+ <version>1.16-R0.5-SNAPSHOT</version>
|
|
+ <packaging>jar</packaging>
|
|
+
|
|
+ <name>Waterfall-Log</name>
|
|
+ <description>Simplistic and performant Log4j2 based logger and console API designed for use with Waterfall and Minecraft related applications.</description>
|
|
+
|
|
+ <properties>
|
|
+ <log4j2.version>2.14.0</log4j2.version>
|
|
+ </properties>
|
|
+
|
|
+ <dependencies>
|
|
+ <!-- Log4j -->
|
|
+ <dependency>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-core</artifactId>
|
|
+ <version>${log4j2.version}</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-iostreams</artifactId>
|
|
+ <version>${log4j2.version}</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>org.apache.logging.log4j</groupId>
|
|
+ <artifactId>log4j-jul</artifactId>
|
|
+ <version>${log4j2.version}</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>com.lmax</groupId>
|
|
+ <artifactId>disruptor</artifactId>
|
|
+ <version>3.4.2</version>
|
|
+ <scope>runtime</scope>
|
|
+ </dependency>
|
|
+ </dependencies>
|
|
+</project>
|
|
diff --git a/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
new file mode 100644
|
|
index 00000000..63f66d3c
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
@@ -0,0 +1,59 @@
|
|
+package io.github.waterfallmc.waterfall.log4j;
|
|
+
|
|
+import com.google.common.base.Strings;
|
|
+import org.apache.logging.log4j.Level;
|
|
+import org.apache.logging.log4j.LogManager;
|
|
+import org.apache.logging.log4j.Logger;
|
|
+import org.apache.logging.log4j.jul.LevelTranslator;
|
|
+import org.apache.logging.log4j.message.MessageFormatMessage;
|
|
+
|
|
+import java.util.Map;
|
|
+import java.util.MissingResourceException;
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
+import java.util.logging.Handler;
|
|
+import java.util.logging.LogRecord;
|
|
+
|
|
+/**
|
|
+ * A {@link Handler} that forwards all log messages to the Log4J logger.
|
|
+ *
|
|
+ * <p>We don't use Log4J's custom JUL LogManager currently, because it breaks
|
|
+ * adding custom handlers to JUL loggers. Some plugins may depend on that
|
|
+ * functionality...</p>
|
|
+ */
|
|
+class Log4JLogHandler extends Handler {
|
|
+
|
|
+ private final Map<String, Logger> cache = new ConcurrentHashMap<>();
|
|
+
|
|
+ @Override
|
|
+ public void publish(LogRecord record) {
|
|
+ if (!isLoggable(record)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ Logger logger = cache.computeIfAbsent(Strings.nullToEmpty(record.getLoggerName()), LogManager::getLogger);
|
|
+
|
|
+ String message = record.getMessage();
|
|
+ if (record.getResourceBundle() != null) {
|
|
+ try {
|
|
+ message = record.getResourceBundle().getString(message);
|
|
+ } catch (MissingResourceException ignored) {
|
|
+ }
|
|
+ }
|
|
+
|
|
+ final Level level = LevelTranslator.toLevel(record.getLevel());
|
|
+ if (record.getParameters() != null && record.getParameters().length > 0) {
|
|
+ logger.log(level, new MessageFormatMessage(message, record.getParameters()), record.getThrown());
|
|
+ } else {
|
|
+ logger.log(level, message, record.getThrown());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void flush() {
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void close() {
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/WaterfallLogger.java b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/WaterfallLogger.java
|
|
new file mode 100644
|
|
index 00000000..e046897a
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/WaterfallLogger.java
|
|
@@ -0,0 +1,34 @@
|
|
+package io.github.waterfallmc.waterfall.log4j;
|
|
+
|
|
+import org.apache.logging.log4j.Level;
|
|
+import org.apache.logging.log4j.LogManager;
|
|
+import org.apache.logging.log4j.io.IoBuilder;
|
|
+import java.util.logging.Handler;
|
|
+import java.util.logging.Logger;
|
|
+
|
|
+public final class WaterfallLogger {
|
|
+
|
|
+ private WaterfallLogger() {
|
|
+ }
|
|
+
|
|
+ public static Logger create() {
|
|
+ org.apache.logging.log4j.Logger redirect = LogManager.getRootLogger();
|
|
+ System.setOut(IoBuilder.forLogger(redirect).setLevel(Level.INFO).buildPrintStream());
|
|
+ System.setErr(IoBuilder.forLogger(redirect).setLevel(Level.ERROR).buildPrintStream());
|
|
+
|
|
+ Logger root = Logger.getLogger("");
|
|
+ root.setUseParentHandlers(false);
|
|
+
|
|
+ // Remove existing handlers
|
|
+ for (Handler handler : root.getHandlers()) {
|
|
+ root.removeHandler(handler);
|
|
+ }
|
|
+
|
|
+ // Setup forward log handler
|
|
+ root.setLevel(java.util.logging.Level.ALL); // Log4j will handle filtering the log
|
|
+ root.addHandler(new Log4JLogHandler());
|
|
+
|
|
+ return Logger.getLogger("BungeeCord");
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/log4j/src/main/resources/log4j2.component.properties b/log4j/src/main/resources/log4j2.component.properties
|
|
new file mode 100644
|
|
index 00000000..e43f5dac
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/resources/log4j2.component.properties
|
|
@@ -0,0 +1,2 @@
|
|
+log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
|
|
+log4j.skipJansi=true
|
|
diff --git a/log4j/src/main/resources/log4j2.xml b/log4j/src/main/resources/log4j2.xml
|
|
new file mode 100644
|
|
index 00000000..93ce3b14
|
|
--- /dev/null
|
|
+++ b/log4j/src/main/resources/log4j2.xml
|
|
@@ -0,0 +1,22 @@
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
+<Configuration status="warn">
|
|
+ <Appenders>
|
|
+ <TerminalConsole name="TerminalConsole">
|
|
+ <PatternLayout pattern="%highlightError{[%d{HH:mm:ss} %level]: %minecraftFormatting{%msg}%n%xEx}" />
|
|
+ </TerminalConsole>
|
|
+ <RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz" immediateFlush="false">
|
|
+ <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %minecraftFormatting{%msg}{strip}%n" />
|
|
+ <Policies>
|
|
+ <TimeBasedTriggeringPolicy />
|
|
+ <OnStartupTriggeringPolicy />
|
|
+ </Policies>
|
|
+ </RollingRandomAccessFile>
|
|
+ </Appenders>
|
|
+
|
|
+ <Loggers>
|
|
+ <Root level="info">
|
|
+ <AppenderRef ref="TerminalConsole" />
|
|
+ <AppenderRef ref="File" />
|
|
+ </Root>
|
|
+ </Loggers>
|
|
+</Configuration>
|
|
diff --git a/pom.xml b/pom.xml
|
|
index 337a87da..bfec1abc 100644
|
|
--- a/pom.xml
|
|
+++ b/pom.xml
|
|
@@ -56,6 +56,7 @@
|
|
<module>config</module>
|
|
<module>event</module>
|
|
<module>log</module>
|
|
+ <module>log4j</module>
|
|
<module>module</module>
|
|
<module>protocol</module>
|
|
<module>proxy</module>
|
|
diff --git a/proxy/pom.xml b/proxy/pom.xml
|
|
index 168eab5c..7a872a54 100644
|
|
--- a/proxy/pom.xml
|
|
+++ b/proxy/pom.xml
|
|
@@ -65,7 +65,7 @@
|
|
</dependency>
|
|
<dependency>
|
|
<groupId>io.github.waterfallmc</groupId>
|
|
- <artifactId>waterfall-log</artifactId>
|
|
+ <artifactId>waterfall-log4j</artifactId>
|
|
<version>${project.version}</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
@@ -99,6 +99,20 @@
|
|
<version>5.1.49</version>
|
|
<scope>runtime</scope>
|
|
</dependency>
|
|
+
|
|
+ <!-- Waterfall start - Console improvements -->
|
|
+ <dependency>
|
|
+ <groupId>net.minecrell</groupId>
|
|
+ <artifactId>terminalconsoleappender</artifactId>
|
|
+ <version>1.2.0</version>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>org.jline</groupId>
|
|
+ <artifactId>jline-terminal-jansi</artifactId>
|
|
+ <version>3.12.1</version>
|
|
+ <scope>runtime</scope>
|
|
+ </dependency>
|
|
+ <!-- Waterfall end -->
|
|
</dependencies>
|
|
|
|
<build>
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java
|
|
new file mode 100644
|
|
index 00000000..765d24bc
|
|
--- /dev/null
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java
|
|
@@ -0,0 +1,39 @@
|
|
+package io.github.waterfallmc.waterfall.console;
|
|
+
|
|
+import net.md_5.bungee.BungeeCord;
|
|
+import net.md_5.bungee.api.ChatColor;
|
|
+import net.md_5.bungee.api.ProxyServer;
|
|
+import net.md_5.bungee.api.chat.ComponentBuilder;
|
|
+import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
|
+import org.jline.reader.LineReader;
|
|
+import org.jline.reader.LineReaderBuilder;
|
|
+
|
|
+public final class WaterfallConsole extends SimpleTerminalConsole {
|
|
+
|
|
+ @Override
|
|
+ protected LineReader buildReader(LineReaderBuilder builder) {
|
|
+ ProxyServer proxy = ProxyServer.getInstance();
|
|
+ return super.buildReader(builder
|
|
+ .appName(proxy.getName())
|
|
+ );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected boolean isRunning() {
|
|
+ return BungeeCord.getInstance().isRunning;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected void runCommand(String command) {
|
|
+ ProxyServer proxy = ProxyServer.getInstance();
|
|
+ if (!proxy.getPluginManager().dispatchCommand(proxy.getConsole(), command)) {
|
|
+ proxy.getConsole().sendMessage(new ComponentBuilder("Command not found").color(ChatColor.RED).create());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected void shutdown() {
|
|
+ ProxyServer.getInstance().stop();
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
index 8c933123..d71556a7 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
@@ -46,7 +46,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
import java.util.logging.Handler;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
-import jline.console.ConsoleReader;
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
import lombok.Synchronized;
|
|
@@ -79,14 +78,11 @@ import net.md_5.bungee.command.CommandEnd;
|
|
import net.md_5.bungee.command.CommandIP;
|
|
import net.md_5.bungee.command.CommandPerms;
|
|
import net.md_5.bungee.command.CommandReload;
|
|
-import net.md_5.bungee.command.ConsoleCommandCompleter;
|
|
import net.md_5.bungee.command.ConsoleCommandSender;
|
|
import net.md_5.bungee.compress.CompressFactory;
|
|
import net.md_5.bungee.conf.Configuration;
|
|
import net.md_5.bungee.conf.YamlConfig;
|
|
import net.md_5.bungee.forge.ForgeConstants;
|
|
-import net.md_5.bungee.log.BungeeLogger;
|
|
-import net.md_5.bungee.log.LoggingOutputStream;
|
|
import net.md_5.bungee.module.ModuleManager;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
import net.md_5.bungee.protocol.DefinedPacket;
|
|
@@ -95,7 +91,6 @@ import net.md_5.bungee.protocol.packet.PluginMessage;
|
|
import net.md_5.bungee.query.RemoteQuery;
|
|
import net.md_5.bungee.scheduler.BungeeScheduler;
|
|
import net.md_5.bungee.util.CaseInsensitiveMap;
|
|
-import org.fusesource.jansi.AnsiConsole;
|
|
|
|
/**
|
|
* Main BungeeCord proxy class.
|
|
@@ -156,8 +151,12 @@ public class BungeeCord extends ProxyServer
|
|
private final File pluginsFolder = new File( "plugins" );
|
|
@Getter
|
|
private final BungeeScheduler scheduler = new BungeeScheduler();
|
|
+ // Waterfall start - Remove ConsoleReader for JLine 3 update
|
|
+ /*
|
|
@Getter
|
|
private final ConsoleReader consoleReader;
|
|
+ */
|
|
+ // Waterfall end
|
|
@Getter
|
|
private final Logger logger;
|
|
public final Gson gson = new GsonBuilder()
|
|
@@ -208,6 +207,8 @@ public class BungeeCord extends ProxyServer
|
|
// BungeeCord. This version is only used when extracting the libraries to their temp folder.
|
|
System.setProperty( "library.jansi.version", "BungeeCord" );
|
|
|
|
+ // Waterfall start - Use TerminalConsoleAppender and Log4J
|
|
+ /*
|
|
AnsiConsole.systemInstall();
|
|
consoleReader = new ConsoleReader();
|
|
consoleReader.setExpandEvents( false );
|
|
@@ -216,6 +217,9 @@ public class BungeeCord extends ProxyServer
|
|
logger = new BungeeLogger( "BungeeCord", "proxy.log", consoleReader );
|
|
System.setErr( new PrintStream( new LoggingOutputStream( logger, Level.SEVERE ), true ) );
|
|
System.setOut( new PrintStream( new LoggingOutputStream( logger, Level.INFO ), true ) );
|
|
+ */
|
|
+ logger = io.github.waterfallmc.waterfall.log4j.WaterfallLogger.create();
|
|
+ // Waterfall end
|
|
|
|
pluginManager = new PluginManager( this );
|
|
getPluginManager().registerCommand( null, new CommandReload() );
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
index a4fe8aad..e830198d 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
@@ -63,6 +63,9 @@ public class BungeeCordLauncher
|
|
|
|
if ( !options.has( "noconsole" ) )
|
|
{
|
|
+ // Waterfall start - Use TerminalConsoleAppender
|
|
+ new io.github.waterfallmc.waterfall.console.WaterfallConsole().start();
|
|
+ /*
|
|
String line;
|
|
while ( bungee.isRunning && ( line = bungee.getConsoleReader().readLine( ">" ) ) != null )
|
|
{
|
|
@@ -71,6 +74,8 @@ public class BungeeCordLauncher
|
|
bungee.getConsole().sendMessage( new ComponentBuilder( "Command not found" ).color( ChatColor.RED ).create() );
|
|
}
|
|
}
|
|
+ */
|
|
+ // Waterfall end
|
|
}
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java
|
|
deleted file mode 100644
|
|
index bd52d880..00000000
|
|
--- a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java
|
|
+++ /dev/null
|
|
@@ -1,25 +0,0 @@
|
|
-package net.md_5.bungee.command;
|
|
-
|
|
-import java.util.ArrayList;
|
|
-import java.util.List;
|
|
-import jline.console.completer.Completer;
|
|
-import lombok.RequiredArgsConstructor;
|
|
-import net.md_5.bungee.api.ProxyServer;
|
|
-
|
|
-@RequiredArgsConstructor
|
|
-public class ConsoleCommandCompleter implements Completer
|
|
-{
|
|
-
|
|
- private final ProxyServer proxy;
|
|
-
|
|
- @Override
|
|
- public int complete(String buffer, int cursor, List<CharSequence> candidates)
|
|
- {
|
|
- List<String> suggestions = new ArrayList<>();
|
|
- proxy.getPluginManager().dispatchCommand( proxy.getConsole(), buffer, suggestions );
|
|
- candidates.addAll( suggestions );
|
|
-
|
|
- int lastSpace = buffer.lastIndexOf( ' ' );
|
|
- return ( lastSpace == -1 ) ? cursor - buffer.length() : cursor - ( buffer.length() - lastSpace - 1 );
|
|
- }
|
|
-}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
index 10366c88..8c5cc949 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
@@ -42,7 +42,7 @@ public class ModuleManager
|
|
ModuleVersion bungeeVersion = ModuleVersion.parse( proxy.getVersion() );
|
|
if ( bungeeVersion == null )
|
|
{
|
|
- System.out.println( "Couldn't detect bungee version. Custom build?" );
|
|
+ proxy.getLogger().warning( "Couldn't detect bungee version. Custom build?" ); // Waterfall - Use logger
|
|
return;
|
|
}
|
|
|
|
--
|
|
2.30.1
|
|
|