log4j日志异步化大幅提升系统性能
经过大型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以上值。
  
  地址:http://www.javaweb.cc/ide/log4j/252040.shtml