【问题标题】:Does setting Property of Log4jContextSelector make any difference设置 Log4jContextSelector 的属性有什么不同吗
【发布时间】:2017-05-19 13:57:11
【问题描述】:

我目前正在探索日志框架 log4j 2。 我没有设置

的属性就配置了我的 log4j2

Log4jContextSelector

我没有在构建路径中添加中断器 jar。

后来在详细阅读文档时,我发现了这个声明。

别忘了设置系统属性 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 使所有记录器异步

当我设置此属性并添加中断器 jar 时,我没有看到任何显着的性能改进。

我通过在 main 方法中添加以下行作为第一行来做到这一点。

System.setProperty("Log4jContextSelector",
                "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

我在此测试期间生成的日志总量为 47.3 MB

这让我觉得设置这个属性的天气有什么不同吗? 或者使用 Log4j2 时默认为异步。

我正在使用以下罐子: 1.log4j-api-2.8.2.jar 2.log4j-core-2.8.2.jar 3.破坏者3.2.0.jar

更新: 在 log4j2-perf 中执行 benchmark.jar。它开始打印指标。我无法理解如何使用这些指标将其与同步记录器进行比较。

【问题讨论】:

    标签: java logging configuration performance-testing log4j2


    【解决方案1】:

    Log4j2 默认是同步的。您提到的系统属性具有所有记录器变为异步的效果。

    你所做的似乎是正确的。您提到您看不到性能是如何受到影响的,但不清楚您是如何尝试衡量这一点的。

    当您的应用程序有多个线程同时记录大量日志时,或者当您需要突发地记录许多消息时,使用 Disruptor 进行异步日志记录的好处变得更加明显。异步日志记录意味着您的应用程序在执行其他工作之前无需等待日志消息格式化和 I/O 完成。

    衡量性能并不容易,但如果您的应用程序需要能够扩展,则值得投入时间。 Log4j2 performance 页面包含指向方法和技术以及性能测试代码的链接。

    【讨论】:

      【解决方案2】:

      Log4j 在调用main method 之前被初始化。 所以它无法从系统中选择你的属性Log4jContextSelector,默认情况下它是同步工作的。

      验证相同: 删除 disruptor 依赖项,如果您的项目仍在运行,则它不会异步。

      如果您通过添加属性 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 那么移除disruptor项目后就不会上去了。

      如果您使用的是 tomcat,请在 catalina.properties 中添加系统属性。不要忘记使用immediateFlush="false"

      【讨论】:

        猜你喜欢
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多