设置Log4jContextSelector的属性是否有任何区别

时间:2017-05-19 13:57:12

标签: java logging configuration performance-testing log4j2

我目前正在探索日志框架log4j 2。 我已经配置了我的log4j2而没有设置

的属性
  

Log4jContextSelector

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

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

  

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

当我设置此属性并添加了disruptor 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. disruptor 3.2.0.jar

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

2 个答案:

答案 0 :(得分:1)

Log4j2默认是同步的。您提到的系统属性会导致所有记录器变为异步。

你正在做的事似乎是正确的。你提到你无法看到性能如何受到影响,但目前还不清楚你是如何衡量这一点的。

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

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

答案 1 :(得分:0)

Log4j在调用main method之前已初始化。 因此,它无法从系统中选择您的属性Log4jContextSelector,默认情况下,它会同步工作。

验证相同: 删除disruptor依赖项,如果您的项目仍在上升,那么它就不会异步。

如果您通过添加属性 - DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 然后在删除干扰器项目后不会上升。

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