当前位置: 首页 > 知识库问答 >
问题:

Log4J2同步记录器比混合异步/同步记录器速度更快

庾勇军
2023-03-14

基于https://logging.apache.org/log4j/2.x/manual/async.html我想使用混合同步和异步记录器的方法,以便从所有同步记录器的性能改进中获益。

基准代码:

public static void main(String[] args) {
    org.apache.logging.log4j.Logger log4j2Logger = org.apache.logging.log4j.LogManager
            .getLogger("com.foo.Bar");

    long start = System.currentTimeMillis();
    int nbLogMessages = 1 * 1000 * 1000;

    for (int i = 0; i < nbLogMessages; i++) {
        log4j2Logger.info("Log Message");
    }

    org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) log4j2Logger;
    org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) coreLogger
            .getContext();
    Map<String, org.apache.logging.log4j.core.Appender> appenders = context
            .getConfiguration().getAppenders();
    for (org.apache.logging.log4j.core.Appender appender : appenders
            .values()) {
        appender.stop();
    }

    long elapsed = System.currentTimeMillis() - start;
    System.out.println("Elapsed " + elapsed + "ms "
            + (nbLogMessages * 1000 / elapsed) + "logs/sec.");
}

Log4j2配置正是文档中的配置(https://logging.apache.org/log4j/2.x/manual/async.html):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <RandomAccessFile name="RandomAccessFile" fileName="/tmp/asyncWithLocation.log" immediateFlush="false" append="false">
      <PatternLayout>
        <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
      </PatternLayout>
    </RandomAccessFile>
  </Appenders>
  <Loggers>
    <!-- pattern layout actually uses location, so we need to include it -->
    <AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
      <AppenderRef ref="RandomAccessFile"/>
    </AsyncLogger>
    <Root level="info" includeLocation="true">
      <AppenderRef ref="RandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

使用这种混合的同步/异步记录器配置,我可以每秒获得大约33400个日志。

现在,如果我用一个普通的记录器替换AsyncLogger“com.foo.Bar”,我可以得到大约35300个日志/秒。

为什么同步记录器策略更快,根据图表,它应该有更高的吞吐量?

我尝试过其他各种方法,比如在按照他们的建议进行基准测试之前“预热”JVM,但都没有用。

请注意,如果我将属性Log4jContextSelector设置为“org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”以激活“所有异步”记录器,则大约可以获得86400个日志/秒。不幸的是,由于其他原因,我不能使用该选项。


操作系统是Ubuntu,8个核心。

共有1个答案

岳景明
2023-03-14

在开始测量之前,我建议您记录少量的消息,比如100000条左右,然后在开始测量循环之前Hibernate一秒钟。(您不想在这里度量log4j的初始化或JVM优化。)

如果在日志循环完成之前(在尝试停止Appender之前)进行测量,您的性能结果是什么?

也可以尝试在配置中设置包含位置="false"。这应该会有很大的不同。

我认为你不应该手动停止附加程序(见我对你另一个问题的回答)。

 类似资料:
  • 我正在尝试设置log4j2以使用异步记录器将所有消息记录到滚动文件中。 是否有一种方法可以创建另一个记录程序来捕获所有事件?还有别的想法吗? 下面是我的log4j2.xml:

  • 使用log4j2,我很难让同步记录器和异步记录器一起工作。 从这里以Apache文档(标题为混合同步和异步记录器)为例,运行下面的应用程序将简单地创建日志文件,但不向其写入任何内容。我也不确定添加两个记录器指向同一个appender,但它的Apache留档,所以我假设这是好的。 LOG4J2配置 pom.xml 应用 但是,如果我更改log4j2配置并修改loggers元素以读取以下内容,我将在日

  • 我最近升级了我的应用程序以使用log4j2。我正在尝试利用它的异步记录器特性。然而,看起来它并没有创建一个。根据Log4j异步配置,它说, 要使所有记录器都是异步的,请将中断器jar添加到类路径中,并将系统属性Log4jContextSelector设置为org.apache.logging.log4j.core.async.AsyncloggerContextSelector。我还设置了log4

  • 背景: 在log4j2中,当使用asyncappender时,您可以将记录器的参数“blocking”设置为false,以便丢弃溢出缓冲区大小的任何日志,而不会减慢主线程的速度。(请参见asyncAppender下的此处。)https://logging.apache.org/log4j/2.x/manual/appenders.html) 我正在将我们的应用程序升级到这里找到的辉煌的asyncL

  • 问题内容: 现在在我的应用程序中,某些时候我们正在将一些繁重的工作记录到日志文件中。 基本上仅用于日志记录,我们先创建可用数据的JSON,然后登录到Log文件。这是以JSON格式记录数据的业务要求。 现在从可用数据创建JSON,然后登录到FILE需要花费大量时间,并影响原始请求的返回时间。现在的想法是改善环境。 我们讨论的一件事是使用以下方法创建线程池 在我们的代码中,然后向其提交任务,该任务会将

  • 我想让一些记录器异步在log4j2.properties文件。在xml格式中,您可以添加为 我在log4j2中试过了。作为记录器的属性=com foo Bar 但这种语法似乎是错误的。 正确的配置方法是什么?