java - Log4j 2 性能 : is single-threaded Console logging faster in Logback than Log4j 2?

标签 java logging log4j logback log4j2

最近,我尝试了 Log4j 2 日志记录,并试图将其性能与我本地 Mac 机器上的 Logback 进行比较。令人惊讶的是,我发现 Logback 在我的测试用例中表现更好。我希望 Log4j 2 比 Log4j 2 网站声称的 Logback 做得更好,所以我想检查一下我在使用 Log4j 2 时是否做错了什么。

为了测试,我使用了直接的 Log4j 2 和 Logback 而没有使用 SLF4J。此外,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>

最佳答案

我认为您尝试独立验证 Log4j2 的性能是否真的像宣传的那样好,这很棒。

我运行了您的测试,这些是我的结果。如您所见,在我的笔记本电脑上,您的测试对 Log4j 2 的评分略高于 Logback。

Log4j 2.6.1    Logback 1.1.7
-----------    -------------
  7,337 ms       7,413 ms     
  6,956 ms       7,097 ms     
  6,748 ms       7,827 ms     
  6,828 ms       7,480 ms     
  6,745 ms       7,067 ms     
  7,146 ms       7,003 ms     
  6,852 ms       7,036 ms     

那么,这些结果意味着什么?您的测试表明,控制台 appender 的同步 日志记录吞吐量在单个 线程中在 Log4j 2 中比在 Logback 中略好。

为了更全面地了解日志库的性能,您还需要比较异步 日志记录、不同的附加程序(尤其是文件 附加程序)和来自 的日志记录>多个线程。

  • > Asynchronous logging比同步日志记录快很多,并且关心性能的应用程序通常会异步记录。在比较日志库性能时,我认为异步日志性能是最重要的基准。
  • 控制台日志记录至少为 50x slower (!) 而不是记录到文件。它会减慢您的应用程序,应该非常小心在生产配置中使用(最好避免)。所以测量控制台日志记录性能不是很有用。大多数应用程序记录到文件,因此文件附加程序可能是开始性能调查的更好地方。
  • 许多应用程序都是多线程的。如果日志库没有经过精心设计来处理这个问题,锁争用会降低您的应用程序的速度。如果您测量来自多个线程的日志记录,您会发现 Log4j 2 的细粒度锁定提供了 much higher throughput than Logback . (使用异步日志记录 difference is even more pronounced 。)

测量多线程日志记录需要格外小心,因为您不想在所有线程都启动之前进行测量,因此您需要 CountDownLatch或类似的东西。

一般来说,我建议查看 JMH一个非常可靠且易于使用的基准测试工具。 Log4j 2 performance page指向用于在页面上生成结果的 JMH 基准。 (例如,FileAppenderBenchmark。)这些可能是熟悉 JMH 和一般性能测试的良好起点。

祝你好运,保持好奇心!

关于java - Log4j 2 性能 : is single-threaded Console logging faster in Logback than Log4j 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142595/

相关文章:

java - 字节码操作/增强和 Java Instrumentation API

Java 软件看起来一半是 Windows,一半是 Metal

python - 使用 Python 日志记录模块时出现重复的日志控制台

java - 日志信息未在控制台上打印

Java多线程合并排序速度问题

Java:将带有时区缩写的日期字符串解析为日期对象

java - JBoss 日志目录中的 swo 和 swp 文件是什么?

java - 如何集中日志配置,只使用 log4j.properties?

java - 电子邮件日志文件,由 Java WebLogic 应用程序服务器生成

java - log4j如何根据日期登录到具有路径的文件