blob: dd64055fcf23e06f960b2e26afe55b0fea0b82e1 [file] [log] [blame]
/*
* 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.util.concurrent.TimeUnit;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.layout.GelfLayout;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.perf.util.DemoAppender;
import org.apache.logging.log4j.util.StringMap;
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;
/**
* Benchmarks Log4j 2 GelfLayout.
*/
// HOW TO RUN THIS TEST
// java -jar target/benchmarks.jar GelfLayoutBenchmark -f 1 -i 5 -wi 5 -bm sample -tu ns
@State(Scope.Thread)
public class GelfLayoutBenchmark {
private static final CharSequence MESSAGE =
"This is rather long and chatty log message with quite some interesting information and a bit of fun in it which is suitable here";
private static final LogEvent EVENT = createLogEvent();
private static final KeyValuePair[] ADDITIONAL_FIELDS = new KeyValuePair[0];
private static LogEvent createLogEvent() {
final Marker marker = null;
final String fqcn = "com.mycom.myproject.mypackage.MyClass";
final org.apache.logging.log4j.Level level = org.apache.logging.log4j.Level.DEBUG;
final Message message = new SimpleMessage(MESSAGE);
final Throwable t = null;
final StringMap mdc = null;
final ThreadContext.ContextStack ndc = null;
final String threadName = null;
final StackTraceElement location = null;
final long timestamp = 12345678;
return Log4jLogEvent.newBuilder() //
.setLoggerName("name(ignored)") //
.setMarker(marker) //
.setLoggerFqcn(fqcn) //
.setLevel(level) //
.setMessage(message) //
.setThrown(t) //
.setContextData(mdc) //
.setContextStack(ndc) //
.setThreadName(threadName) //
.setSource(location) //
.setTimeMillis(timestamp) //
.build();
}
Appender appender;
int j;
@Setup
public void setUp() {
System.setProperty("log4j2.enable.direct.encoders", "true");
appender = new DemoAppender(GelfLayout.newBuilder()
.setConfiguration(new NullConfiguration())
.setHost("host")
.setAdditionalFields(ADDITIONAL_FIELDS)
.setCompressionType(GelfLayout.CompressionType.OFF)
.setCompressionThreshold(0)
.setIncludeStacktrace(true)
.setIncludeThreadContext(true)
.build());
j = 0;
}
@TearDown
public void tearDown() {
System.clearProperty("log4j2.enable.direct.encoders");
}
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Benchmark
public boolean baseline() {
++j;
return true;
}
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Benchmark
public void log4j2Gelf() {
appender.append(EVENT);
}
}