【发布时间】:2016-07-01 10:05:07
【问题描述】:
最近,我尝试了 Log4j 2 日志记录,并尝试在我的本地 Mac 机器上将其性能与 Logback 进行比较。令人惊讶的是,我发现 Logback 在我的测试用例中表现更好。我希望 Log4j 2 比 Log4j 2 网站声称的 Logback 做得更好,所以我想检查一下我在使用 Log4j 2 时是否做错了。
为了测试,我使用了直接 Log4j 2 和使用 SLF4J 不使用的 Logback。另外,两个日志框架都使用了 ConsoleAppender,我测试的模式是:
<Pattern>%d{YYYY-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
日志测试代码为:
logger.info("This is a bootstrap message");
long start = System.currentTimeMillis();
for (int i = 1; i <= 1000000; i++) {
logger.info("Order={} successfully processed", "ABC123");
}
long end = System.currentTimeMillis();
logger.info("time taken to process={} ms", end - start);
我为每个日志分别运行了 10 次测试,并尝试计算平均处理时间。出乎意料的是,logback 在每次运行中都表现得更好。我尝试使用参数禁用 Log4j 2 附带的默认 GC 日志记录:
-Dlog4j2.enable.threadlocals=false -Dlog4j2.enable.direct.encoders=false
但我仍然没有看到比 logback 有任何改进。谁能确认我的做法是否正确?
log4j 2 配置:
<Configuration status="INFO" debug="false">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.mycompany.app" level="INFO"/>
<Root level="INFO">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
Logback 配置:
<configuration debug="true" scan="true" scanPeriod="1 hour">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{YYYY-MM-dd HH:mm:ss:S} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="com.mycompany.app" level="info"/>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
【问题讨论】:
-
在任何情况下,您都可以执行
Task.Run(() => logger.info("Order={} successfully processed", "ABC123"));,它将在另一个线程中运行它,这样您就不会被阻塞。唯一可能发生的问题是“一劳永逸”的心态,即如果失败了,您将不会知道。 -
嗨 Stan,谢谢,但这对它们的性能没有任何影响,两个框架都将从中受益,我想看看我在配置 log4j 2 时是否做错了跨度>
-
请同时显示您的 Log4j2 配置和 Logback 配置,以便人们重现您的测试。
-
嗨@RemkoPopma 配置添加
标签: java logging log4j logback log4j2