经过大型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以上值。
    
  
  

