通過大型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% sql
從結果能夠看出,性能提升率最高 47%。最低32%。緩衝爲256時性能改善最佳, 提升47%
結論:使用Log4j的J2EE應用,日誌的優化對系統性能有顯著影響:
1)儘可能減小沒必要要的日誌輸出,尤爲要避免 root logger上太低級別的輸出,避免在生產環境上向控制檯輸出日誌。例如,下面的配置是很影響性能的,:
<root>
<priority value="DEBUG" />
<appender-ref ref="CONSOLE" >
</root>
2) 使用Async logger輸出日誌,buffersize在相應日誌頻率下,越大越好,對於大型項目,能夠選2048以上值。 apache