This is an automated email from the ASF dual-hosted git repository.
ckozak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new 718e741 Parameterize FileAppenderThrowableBenchmark
718e741 is described below
commit 718e74128308fc9df17e012e78c061ce619fbe76
Author: Carter Kozak <[email protected]>
AuthorDate: Tue Dec 31 13:16:40 2019 -0500
Parameterize FileAppenderThrowableBenchmark
Ensures all (both) tests are run against all implementations.
Added async context (fully async) variants of the existing async
configuration benchmarks.
---
.../perf/jmh/FileAppenderThrowableBenchmark.java | 285 ++++++++++++++-------
1 file changed, 196 insertions(+), 89 deletions(-)
diff --git
a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
index 7bf5ba9..fde3b47 100644
---
a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
+++
b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
@@ -19,12 +19,16 @@ package org.apache.logging.log4j.perf.jmh;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.async.AsyncLoggerContext;
+import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
+import org.apache.logging.log4j.core.util.Constants;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
@@ -48,16 +52,29 @@ import java.util.logging.Level;
*/
// HOW TO RUN THIS TEST
// java -jar target/benchmarks.jar ".*FileAppenderThrowableBenchmark.*" -f 1
-i 10 -wi 20 -bm sample -tu ns
-@State(Scope.Thread)
+@State(Scope.Benchmark)
@Threads(1)
@Fork(1)
@Warmup(iterations = 3, time = 3)
@Measurement(iterations = 3, time = 3)
public class FileAppenderThrowableBenchmark {
+ static {
+ // log4j2
+ System.setProperty("log4j2.is.webapp", "false");
+ System.setProperty("log4j.configurationFile",
"log4j2-perf-file-throwable.xml");
+ // log4j 1.2
+ System.setProperty("log4j.configuration",
"log4j12-perf-file-throwable.xml");
+ // logback
+ System.setProperty("logback.configurationFile",
"logback-perf-file-throwable.xml");
+ }
private static final Throwable THROWABLE = getSimpleThrowable();
private static final Throwable COMPLEX_THROWABLE = getComplexThrowable();
+ @SuppressWarnings("unused") // Set by JMH
+ @Param
+ private LoggingConfiguration loggingConfiguration;
+
private static Throwable getSimpleThrowable() {
return new IllegalStateException("Test Throwable");
}
@@ -136,43 +153,16 @@ public class FileAppenderThrowableBenchmark {
throw new IllegalStateException("Failed to create throwable");
}
- private FileHandler julFileHandler;
- Logger log4j2ExtendedThrowable;
- Logger log4j2ExtendedThrowableAsync;
- Logger log4j2SimpleThrowable;
- Logger log4j2SimpleThrowableAsync;
- org.slf4j.Logger slf4jLogger;
- org.apache.log4j.Logger log4j1Logger;
- java.util.logging.Logger julLogger;
@Setup
public void setUp() throws Exception {
deleteLogFiles();
- System.setProperty("log4j2.is.webapp", "false");
- System.setProperty("log4j.configurationFile",
"log4j2-perf-file-throwable.xml");
- System.setProperty("log4j.configuration",
"log4j12-perf-file-throwable.xml");
- System.setProperty("logback.configurationFile",
"logback-perf-file-throwable.xml");
-
- log4j2ExtendedThrowable = LogManager.getLogger("RAFExtendedException");
- log4j2ExtendedThrowableAsync =
LogManager.getLogger("async.RAFExtendedException");
- log4j2SimpleThrowable = LogManager.getLogger("RAFSimpleException");
- log4j2SimpleThrowableAsync =
LogManager.getLogger("async.RAFSimpleException");
- slf4jLogger = LoggerFactory.getLogger(getClass());
- log4j1Logger = org.apache.log4j.Logger.getLogger(getClass());
-
- julFileHandler = new FileHandler("target/testJulLog.log");
- julLogger = java.util.logging.Logger.getLogger(getClass().getName());
- julLogger.setUseParentHandlers(false);
- julLogger.addHandler(julFileHandler);
- julLogger.setLevel(Level.ALL);
+ loggingConfiguration.setUp();
}
@TearDown
- public void tearDown() {
- System.clearProperty("log4j2.is.webapp");
- System.clearProperty("log4j.configurationFile");
- System.clearProperty("log4j.configuration");
- System.clearProperty("logback.configurationFile");
+ public void tearDown() throws Exception{
+ loggingConfiguration.tearDown();
deleteLogFiles();
}
@@ -189,81 +179,198 @@ public class FileAppenderThrowableBenchmark {
julFile.delete();
}
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void log4j1() {
- log4j1Logger.error("Caught an exception", THROWABLE);
- }
+ @SuppressWarnings("unused") // Used by JMH
+ public enum LoggingConfiguration {
+ LOG4J2_EXTENDED_THROWABLE() {
+ Logger logger;
+ @Override
+ void setUp() throws Exception {
+ logger = LogManager.getLogger("RAFExtendedException");
+ }
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void complexLog4j1() {
- log4j1Logger.error("Caught an exception", COMPLEX_THROWABLE);
- }
+ @Override
+ void tearDown() throws Exception {
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void log4j2Throwable() {
- log4j2SimpleThrowable.error("Caught an exception", THROWABLE);
- }
+ }
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void complexLog4j2Throwable() {
- log4j2SimpleThrowable.error("Caught an exception", COMPLEX_THROWABLE);
- }
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOG4J2_EXTENDED_THROWABLE_ASYNC() {
+ Logger logger;
+ @Override
+ void setUp() throws Exception {
+ System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR,
+ AsyncLoggerContextSelector.class.getName());
+ logger = LogManager.getLogger("RAFExtendedException");
+ if
(!AsyncLoggerContext.class.equals(LogManager.getContext(false).getClass())) {
+ throw new IllegalStateException("Expected an
AsyncLoggerContext");
+ }
+ }
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void complexLog4j2ThrowableAsync() {
- log4j2SimpleThrowableAsync.error("Caught an exception",
COMPLEX_THROWABLE);
- }
+ @Override
+ void tearDown() throws Exception {
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void log4j2ExtendedThrowable() {
- log4j2ExtendedThrowable.error("Caught an exception", THROWABLE);
- }
+ }
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void complexLog4j2ExtendedThrowable() {
- log4j2ExtendedThrowable.error("Caught an exception",
COMPLEX_THROWABLE);
- }
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOG4J2_EXTENDED_THROWABLE_ASYNC_CONFIG() {
+ Logger logger;
+ @Override
+ void setUp() throws Exception {
+ logger = LogManager.getLogger("async.RAFExtendedException");
+ }
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void complexLog4j2ExtendedThrowableAsync() {
- log4j2ExtendedThrowableAsync.error("Caught an exception",
COMPLEX_THROWABLE);
- }
+ @Override
+ void tearDown() throws Exception {
- @BenchmarkMode(Mode.Throughput)
- @OutputTimeUnit(TimeUnit.SECONDS)
- @Benchmark
- public void logbackFile() {
- slf4jLogger.error("Caught an exception", THROWABLE);
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOG4J2_THROWABLE() {
+ Logger logger;
+ @Override
+ void setUp() throws Exception {
+ logger = LogManager.getLogger("RAFSimpleException");
+ }
+
+ @Override
+ void tearDown() throws Exception {
+
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOG4J2_THROWABLE_ASYNC() {
+ Logger logger;
+ @Override
+ void setUp() throws Exception {
+ System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR,
+ AsyncLoggerContextSelector.class.getName());
+ logger = LogManager.getLogger("RAFSimpleException");
+ if
(!AsyncLoggerContext.class.equals(LogManager.getContext(false).getClass())) {
+ throw new IllegalStateException("Expected an
AsyncLoggerContext");
+ }
+ }
+
+ @Override
+ void tearDown() throws Exception {
+
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOG4J2_THROWABLE_ASYNC_CONFIG() {
+ Logger logger;
+ @Override
+ void setUp() throws Exception {
+ logger = LogManager.getLogger("async.RAFSimpleException");
+ }
+
+ @Override
+ void tearDown() throws Exception {
+
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOG4J1() {
+ org.apache.log4j.Logger logger;
+ @Override
+ void setUp() throws Exception {
+ logger =
org.apache.log4j.Logger.getLogger(FileAppenderThrowableBenchmark.class);
+ }
+
+ @Override
+ void tearDown() throws Exception {
+
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ LOGBACK() {
+ org.slf4j.Logger logger;
+
+ @Override
+ void setUp() throws Exception {
+ logger =
LoggerFactory.getLogger(FileAppenderThrowableBenchmark.class);
+ }
+
+ @Override
+ void tearDown() throws Exception {
+
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ logger.error(message, throwable);
+ }
+ },
+ JUL() {
+ private FileHandler julFileHandler;
+ private java.util.logging.Logger logger;
+
+ @Override
+ void setUp() throws Exception {
+ julFileHandler = new FileHandler("target/testJulLog.log");
+ logger =
java.util.logging.Logger.getLogger(getClass().getName());
+ logger.setUseParentHandlers(false);
+ logger.addHandler(julFileHandler);
+ logger.setLevel(Level.ALL);
+ }
+
+ @Override
+ void tearDown() throws Exception {
+ julFileHandler.close();
+ }
+
+ @Override
+ void log(String message, Throwable throwable) {
+ // must specify sourceClass or JUL will look it up by walking
the stack trace!
+ logger.logp(Level.SEVERE,
FileAppenderThrowableBenchmark.class.getName(), "param1JulFile", message,
throwable);
+ }
+ };
+
+ abstract void setUp() throws Exception;
+
+ abstract void tearDown() throws Exception;
+
+ abstract void log(String message, Throwable throwable);
}
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Benchmark
- public void complexLogbackFile() {
- slf4jLogger.error("Caught an exception", COMPLEX_THROWABLE);
+ public void simpleThrowable() {
+ loggingConfiguration.log("Caught an exception", THROWABLE);
}
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Benchmark
- public void julFile() {
- // must specify sourceClass or JUL will look it up by walking the
stack trace!
- julLogger.logp(Level.SEVERE, getClass().getName(), "param1JulFile",
"Caught an exception", THROWABLE);
+ public void complexThrowable() {
+ loggingConfiguration.log("Caught an exception", COMPLEX_THROWABLE);
}
}