/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache license, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the license for the specific language governing permissions and * limitations under the license. */ package org.apache.logging.log4j.perf.jmh; import java.io.File; import java.util.concurrent.TimeUnit; import java.util.logging.FileHandler; import java.util.logging.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.TearDown; import org.slf4j.LoggerFactory; /** * Benchmarks Log4j 2, Log4j 1, Logback and JUL using the DEBUG level which is enabled for this test. The configuration * for each uses a FileAppender */ // HOW TO RUN THIS TEST // java -jar log4j-perf/target/benchmarks.jar ".*FileAppenderBenchmark.*" -f 1 -wi 10 -i 20 // // RUNNING THIS TEST WITH 4 THREADS: // java -jar log4j-perf/target/benchmarks.jar ".*FileAppenderBenchmark.*" -f 1 -wi 10 -i 20 -t 4 @State(Scope.Thread) public class FileAppenderBenchmark { public static final String MESSAGE = "This is a debug message"; private FileHandler julFileHandler; Logger log4j2Logger; Logger log4j2AsyncAppender; Logger log4j2AsyncLogger; Logger log4j2AsyncDisruptor; Logger log4j2RandomLogger; Logger log4j2MemoryLogger; org.slf4j.Logger slf4jLogger; org.slf4j.Logger slf4jAsyncLogger; org.apache.log4j.Logger log4j1Logger; java.util.logging.Logger julLogger; @Setup public void setUp() throws Exception { System.setProperty("log4j.configurationFile", "log4j2-perf.xml"); System.setProperty("log4j.configuration", "log4j12-perf.xml"); System.setProperty("logback.configurationFile", "logback-perf.xml"); deleteLogFiles(); log4j2Logger = LogManager.getLogger(FileAppenderBenchmark.class); log4j2AsyncAppender = LogManager.getLogger("AsyncAppender"); log4j2AsyncDisruptor = LogManager.getLogger("AsyncDisruptorAppender"); log4j2AsyncLogger = LogManager.getLogger("AsyncLogger"); log4j2MemoryLogger = LogManager.getLogger("MemoryMapped"); log4j2RandomLogger = LogManager.getLogger("TestRandom"); slf4jLogger = LoggerFactory.getLogger(FileAppenderBenchmark.class); slf4jAsyncLogger = LoggerFactory.getLogger("Async"); log4j1Logger = org.apache.log4j.Logger.getLogger(FileAppenderBenchmark.class); julFileHandler = new FileHandler("target/testJulLog.log"); julLogger = java.util.logging.Logger.getLogger(getClass().getName()); julLogger.setUseParentHandlers(false); julLogger.addHandler(julFileHandler); julLogger.setLevel(Level.ALL); } @TearDown public void tearDown() { System.clearProperty("log4j.configurationFile"); System.clearProperty("log4j.configuration"); System.clearProperty("logback.configurationFile"); deleteLogFiles(); } private void deleteLogFiles() { final File logbackFile = new File("target/testlogback.log"); logbackFile.delete(); final File log4jFile = new File ("target/testlog4j.log"); log4jFile.delete(); final File log4jRandomFile = new File ("target/testRandomlog4j2.log"); log4jRandomFile.delete(); final File log4jMemoryFile = new File ("target/testMappedlog4j2.log"); log4jMemoryFile.delete(); final File log4j2File = new File ("target/testlog4j2.log"); log4j2File.delete(); final File julFile = new File("target/testJulLog.log"); julFile.delete(); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j2RAF() { log4j2RandomLogger.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j2MMF() { log4j2MemoryLogger.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j2AsyncAppender() { log4j2AsyncAppender.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j2AsyncDisruptor() { log4j2AsyncDisruptor.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j2AsyncLogger() { log4j2AsyncLogger.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j2File() { log4j2Logger.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void logbackFile() { slf4jLogger.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void logbackAsyncFile() { slf4jAsyncLogger.debug(MESSAGE); } @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Benchmark public void log4j1File() { log4j1Logger.debug(MESSAGE); } @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.INFO, getClass().getName(), "julFile", MESSAGE); } }