实例测试不同日志框架性能, 通过修改BaseLogInfo中的线程数和数据总数,可以测试不同量级情况下,性能的差距。
依赖:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<!-- LogBack -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
配置文件:
log4j:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./logs/log4j.log"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p %C [%t] $m$n"/>
</layout>
</appender>
<appender name="ASYNC-INFO" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="512"/>
<param name="locationInfo" value="true"/>
<appender-ref ref="INFO"/>
</appender>
<root>
<priority value="debug"/>
<!-- <!–同步日志–>-->
<!-- <appender-ref ref="INFO"/>-->
<!--异步日志-->
<appender-ref ref="ASYNC-INFO"/>
</root>
</log4j:configuration>
log4j2
<?xml version="1.0" encoding="utf-8" ?>
<Configuration status="debug" strict="true" name="XMLConfigTest">
<Properties>
<Property name="filename">./logs/log4j2.log</Property>
</Properties>
<Appenders>
<RandomAccessFile name="INFO" fileName="${filename}"
immediateFlush="false" append="true">
<PatternLayout>
<Pattern>%d %p %C [%t] %m%n</Pattern>
</PatternLayout>
</RandomAccessFile>
</Appenders>
<Loggers>
<!--同步日志-->
<!-- <Root level="debug" additivity="false">-->
<!-- <AppenderRef ref="INFO"/>-->
<!-- </Root>-->
<!--异步日志-->
<AsyncRoot level="debug" additivity="false" includeLocation="true" bufferSize="512">
<AppenderRef ref="INFO"/>
</AsyncRoot>
</Loggers>
</Configuration>
logback:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<timestamp key="timestamp" datePattern="yyyyMMddHHmm"/>
<property name="SYSTEM_LOG_FOLDER" value="/Users/yangmingyue/logefficiency/logs"/>
<property name="SYSTEM_LOG_NAME" value="system"/>
<property name="pattern" value="%msg%n"/>
<!-- 按照每天生成日志文件 -->
<appender name="SYSTEM_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${SYSTEM_LOG_FOLDER}/${SYSTEM_LOG_NAME}.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SYSTEM_LOG_FOLDER}/${SYSTEM_LOG_NAME}_%d{yyyyMMdd}.%i.log</fileNamePattern>
<maxHistory>1</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="ASYNC-SYSTEM" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<appender-ref ref="SYSTEM"/>
<includeCallerData>true</includeCallerData>
</appender>
<!-- <logger name="SYSTEM" level="debug" additivity="false">-->
<!-- <appender-ref ref="SYSTEM_LOG"/>-->
<!-- </logger>-->
<!-- 日志输出级别 -->
<root level="DEBUG">
<!-- <!–同步日志–>-->
<!-- <appender-ref ref="SYSTEM_LOG"/>-->
<!--异步日志-->
<appender-ref ref="ASYNC-SYSTEM"/>
</root>
</configuration>
测试类:
基础类:
public class BaseLogInfo {
public final static int TOTAL_THREAD = 50;
public final static int TOTAL_DATA_SIZE = 1000000;
}
TestLog4j
import org.apache.log4j.Logger;
import java.util.concurrent.CountDownLatch;
public class TestLog4j extends BaseLogInfo{
private static final Logger logger = Logger.getLogger(TestLog4j.class);
public static void main(String[] args) throws InterruptedException {
System.out.println("Log4j 100万 start fixedPrinting");
final CountDownLatch cdt = new CountDownLatch(TOTAL_THREAD);
long startTime = System.currentTimeMillis();
for (int i = 0; i < TOTAL_THREAD; i++) {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < TOTAL_DATA_SIZE/TOTAL_THREAD; i++) {
logger.info("Hello world FixedPrinting");
}
cdt.countDown();
}
}).start();
}
cdt.await();
long endTime = System.currentTimeMillis();
System.out.println("log4j 100万 : " + (endTime - startTime) + "ms");
}
}
TestLog4j2
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.concurrent.CountDownLatch;
public class TestLog4j2 extends BaseLogInfo{
private static final Logger logger = LogManager.getLogger(TestLog4j2.class);
public static void main(String[] args) throws InterruptedException {
System.out.println("Log4j2 100万 start fixedPrinting");
final CountDownLatch cdt = new CountDownLatch(TOTAL_THREAD);
long startTime = System.currentTimeMillis();
for (int i = 0; i < TOTAL_THREAD; i++) {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < TOTAL_DATA_SIZE/TOTAL_THREAD; i++) {
logger.info("Hello world FixedPrinting");
}
cdt.countDown();
}
}).start();
}
cdt.await();
long endTime = System.currentTimeMillis();
System.out.println("log4j2 100万 : " + (endTime - startTime) + "ms");
}
}
TestLogback
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.CountDownLatch;
public class TestLogback extends BaseLogInfo{
private static final Logger logger = LoggerFactory.getLogger(TestLog4j2.class);
public static void main(String[] args) throws InterruptedException {
System.out.println("Logback 100万 start fixedPrinting");
final CountDownLatch cdt = new CountDownLatch(TOTAL_THREAD);
long startTime = System.currentTimeMillis();
for (int i = 0; i < TOTAL_THREAD; i++) {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < TOTAL_DATA_SIZE/TOTAL_THREAD; i++) {
logger.info("Hello world FixedPrinting");
}
cdt.countDown();
}
}).start();
}
cdt.await();
long endTime = System.currentTimeMillis();
System.out.println("logback 100万 : " + (endTime - startTime) + "ms");
}
}
一百万条数据写入, 50个线程。
在都是异步的情况下:
Logback 100万 start fixedPrinting
logback 100万 : 11672ms
Log4j2 100万 start fixedPrinting
log4j2 100万 : 34ms
Log4j 100万 start fixedPrinting
log4j 100万 : 12021ms
同步情况下:
Logback 100万 start fixedPrinting
logback 100万 : 14642ms
Log4j2 100万 start fixedPrinting
log4j2 100万 : 5330ms
Log4j 100万 start fixedPrinting
log4j 100万 : 26372ms
测试结果可知:
同步情况下:log4j2 效率最高,时间最短
异步情况下:log4j2效率也是最高,时间最短,而且能看出,效率比其他高出很多
异步情况下,log4j2 时间变化最大