Use AsyncAppender instead of AsyncLoggerContextSelector to keep loggging IO off main thread (#6381)

This commit is contained in:
Jason Penilla 2021-08-12 10:55:20 -07:00
parent 0850e18436
commit 1093b2f26a
5 changed files with 61 additions and 72 deletions

View File

@ -497,25 +497,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/resources/log4j2.xml --- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml
@@ -0,0 +0,0 @@ @@ -0,0 +0,0 @@
</Policies>
<DefaultRolloverStrategy max="1000"/> <DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile> </RollingRandomAccessFile>
<Async name="Async">
+ <AppenderRef ref="rewrite"/>
+ </Async>
+ <Rewrite name="rewrite"> + <Rewrite name="rewrite">
+ <StacktraceDeobfuscatingRewritePolicy /> + <StacktraceDeobfuscatingRewritePolicy />
+ <AppenderRef ref="File"/> <AppenderRef ref="File"/>
+ <AppenderRef ref="TerminalConsole" level="info"/> <AppenderRef ref="TerminalConsole" level="info"/>
+ <AppenderRef ref="ServerGuiConsole" level="info"/> <AppenderRef ref="ServerGuiConsole" level="info"/>
- </Async>
+ </Rewrite> + </Rewrite>
</Appenders> </Appenders>
<Loggers> <Loggers>
<Root level="info"> <Root level="info">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL" />
</filters>
- <AppenderRef ref="File"/>
- <AppenderRef ref="TerminalConsole" level="info"/>
- <AppenderRef ref="ServerGuiConsole" level="info"/>
+ <AppenderRef ref="rewrite"/>
</Root>
</Loggers>
</Configuration>

View File

@ -353,8 +353,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
OptionSet options = null; OptionSet options = null;
+ // Paper start - preload logger classes to avoid plugins mixing versions + // Paper start - preload logger classes to avoid plugins mixing versions
+ tryPreloadClass("com.destroystokyo.paper.log.LogFullPolicy");
+ tryPreloadClass("org.apache.logging.log4j.core.Core"); + tryPreloadClass("org.apache.logging.log4j.core.Core");
+ tryPreloadClass("org.apache.logging.log4j.core.appender.AsyncAppender");
+ tryPreloadClass("org.apache.logging.log4j.core.Appender"); + tryPreloadClass("org.apache.logging.log4j.core.Appender");
+ tryPreloadClass("org.apache.logging.log4j.core.ContextDataInjector"); + tryPreloadClass("org.apache.logging.log4j.core.ContextDataInjector");
+ tryPreloadClass("org.apache.logging.log4j.core.Filter"); + tryPreloadClass("org.apache.logging.log4j.core.Filter");

View File

@ -233,6 +233,15 @@ diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/resources/log4j2.xml --- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml
@@ -0,0 +0,0 @@
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
<Async name="Async">
- <AppenderRef ref="rewrite"/>
+ <AppenderRef ref="rewrite2"/>
</Async>
<Rewrite name="rewrite">
<StacktraceDeobfuscatingRewritePolicy />
@@ -0,0 +0,0 @@ @@ -0,0 +0,0 @@
<AppenderRef ref="TerminalConsole" level="info"/> <AppenderRef ref="TerminalConsole" level="info"/>
<AppenderRef ref="ServerGuiConsole" level="info"/> <AppenderRef ref="ServerGuiConsole" level="info"/>
@ -244,11 +253,3 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
</Appenders> </Appenders>
<Loggers> <Loggers>
<Root level="info"> <Root level="info">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL" />
</filters>
- <AppenderRef ref="rewrite"/>
+ <AppenderRef ref="rewrite2"/>
</Root>
</Loggers>
</Configuration>

View File

@ -0,0 +1,44 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
Date: Thu, 12 Aug 2021 04:46:41 -0700
Subject: [PATCH] Use AsyncAppender to keep logging IO off main thread
diff --git a/build.gradle.kts b/build.gradle.kts
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -0,0 +0,0 @@ dependencies {
}
runtimeOnly("org.xerial:sqlite-jdbc:3.34.0")
runtimeOnly("mysql:mysql-connector-java:8.0.23") // Paper
+ runtimeOnly("com.lmax:disruptor:3.4.4") // Paper
runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.1")
runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.0")
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml
@@ -0,0 +0,0 @@
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
+ <Async name="Async">
+ <AppenderRef ref="File"/>
+ <AppenderRef ref="TerminalConsole" level="info"/>
+ <AppenderRef ref="ServerGuiConsole" level="info"/>
+ </Async>
</Appenders>
<Loggers>
<Root level="info">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL" />
</filters>
- <AppenderRef ref="File"/>
- <AppenderRef ref="TerminalConsole" level="info"/>
- <AppenderRef ref="ServerGuiConsole" level="info"/>
+ <AppenderRef ref="Async"/>
</Root>
</Loggers>
</Configuration>

View File

@ -1,49 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Minecrell <minecrell@minecrell.net>
Date: Tue, 17 Jul 2018 16:42:17 +0200
Subject: [PATCH] Use asynchronous Log4j 2 loggers
diff --git a/build.gradle.kts b/build.gradle.kts
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -0,0 +0,0 @@ dependencies {
}
runtimeOnly("org.xerial:sqlite-jdbc:3.34.0")
runtimeOnly("mysql:mysql-connector-java:8.0.23") // Paper
+ runtimeOnly("com.lmax:disruptor:3.4.2") // Paper
runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.1")
runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.0")
diff --git a/src/main/java/com/destroystokyo/paper/log/LogFullPolicy.java b/src/main/java/com/destroystokyo/paper/log/LogFullPolicy.java
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/log/LogFullPolicy.java
@@ -0,0 +0,0 @@
+package com.destroystokyo.paper.log;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.async.AsyncQueueFullPolicy;
+import org.apache.logging.log4j.core.async.EventRoute;
+
+public final class LogFullPolicy implements AsyncQueueFullPolicy {
+
+ /*
+ * Prevents log calls being logged out of order when the log queue is full.
+ */
+
+ @Override
+ public EventRoute getRoute(final long backgroundThreadId, final Level level) {
+ return EventRoute.ENQUEUE;
+ }
+}
diff --git a/src/main/resources/log4j2.component.properties b/src/main/resources/log4j2.component.properties
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/resources/log4j2.component.properties
+++ b/src/main/resources/log4j2.component.properties
@@ -1 +1,3 @@
+Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
+log4j2.AsyncQueueFullPolicy="com.destroystokyo.paper.log.LogFullPolicy"
log4j.skipJansi=true