log4j日志异步化大幅提升系统性能

系统 1484 0
经过大型J2EE项目实测,Log4j的日志输出对系统性能有比较显著的影响,尤其是日志输入量比较大时,例如:系统并发量很大,显示Hibernate的sql和参数日志,或日志级别较低DEBUG或INFO时等。
使用Async Logger控制日志输出可以显著改善系统性能。
 
 
1) 测试用例:同步文件日志输出
       测试功能:模块管理功能,
       输出Hibernate SQL和参数,输出到文件,配置如下:
       <appender name="Hibernate_SQL" class="org.apache.log4j.DailyRollingFileAppender">
              <param name="File" value="log/Hibernate_SQL.log" />
              <param name="Append" value="true" />
              <param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%-5p](%C,%L) - %m%n" />
              </layout>
       </appender>
      
       <category name="org.hibernate.SQL">
              <priority value="TRACE" />        
              <appender-ref ref="Hibernate_SQL" />
       </category>
       <category name="org.hibernate.type">
              <priority value="TRACE" />        
              <appender-ref ref="Hibernate_SQL" />
       </category>
       运用JMeter进行压力测试,线程数50,运行4次,计算请求平均响应值(Rame-up Period: 1, 循环次数:1)
 
测试结果:AVG: 12565ms
 
    2) 测试用例:异步文件日志输出
       Log4j.xml 配置修改如下:
    <appender name="ASYNC_Hibernate_SQL" class="org.apache.log4j.AsyncAppender">   
     <param name="BufferSize" value="512"/>   
     <appender-ref ref="Hibernate_SQL"/>
   </appender>
   
    <category name="org.hibernate.SQL">
        <priority value="TRACE" />     
        <appender-ref ref="ASYNC_Hibernate_SQL" />
    </category>
   
    <category name="org.hibernate.type">
        <priority value="TRACE" />     
        <appender-ref ref="ASYNC_Hibernate_SQL" />
    </category>
   
    在BufferSize为 32, 64,128,256,512,2048时测试的请求平均耗时,及较测试用例1中的性能提高率对比如下所示:
同步,异步日志性能对比分析
(每次50并发,运行4次)
 
sync 日志输出
原时间消耗
 
 
12565
 
async 日志输出
 
 
缓冲区大小
平均耗时
性能提高率
32
6744
46.33%
64
8487
32.46%
128
6899
45.09%
256
6606
47.43%
512
7306
41.85%
2048
3406
72.89%
 
    从结果可以看出,性能提高率最高 47%。最低32%。缓冲为256时性能改善最佳, 提高47%
   
结论:使用 Log4j的J2EE应用,日志的优化对系统性能有显著影响:
     1)尽量减少不必要的日志输出,尤其要避免 root logger上过低级别的输出,避免在生产环境上向控制台输出日志。例如,下面的配置是很影响性能的,:
    <root>
        <priority value="DEBUG" /> 
        <appender-ref ref="CONSOLE" >  
    </root>
    2) 使用 Async logger输出日志,buffersize在相应日志频率下,越大越好,对于大型项目,可以选2048以上值。

log4j日志异步化大幅提升系统性能


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论