logback log4j log4j2 性能實測
轉載:
https://blog.souche.com/logback-log4j-log4j2shi-ce/
日志已經成為系統開發中不可或缺的一部分. 但是針對logback, log4j和log4j2. 究竟改如何選擇? 到底性能如何? 今天我們做一個實際的測評. 相信看完這篇文章, 對這三個日志框架會有很清楚的一個了解.
實驗環境
- OS: Mac OS X 10.12.1
- CPU: 2.6 GHz Intel Core i5
- 內存: 8 GB 1600 MHz DDR3
為了說明, 測試的准確性, 把測試過程展示出來
首先 把項目建起來 log4j-1.2.17, logback-1.1.7, log4j2-2.7, slf4j-api-1.7.21 保證用的jar包版本都一樣.

然后配置各自的配置文件, 我們為了保證測試效果, 三種框架采取同樣的輸出格式, 在異步輸出的時候, 都采取512的緩存.
log4j.xml

logback.xml

log4j2.xml

寫兩個測試方法


看結果

- 可見在同步日志模式下, Logback的性能是最糟糕的.
- 而log4j2的性能無論在同步日志模式還是異步日志模式下都是最佳的.
其根本原因在於log4j2使用了LMAX, 一個無鎖的線程間通信庫代替了, logback和log4j之前的隊列. 並發性能大大提升, 下期文章將研究一下LMAX, 到底是什么
實用信息
關於log4j2的新特性
- 丟數據這種情況少,可以用來做審計功能。而且自身內部報的exception會被發現,但是logback和log4j不會。
- log4j2使用了disruptor技術,在多線程環境下,性能高於logback等10倍以上。
- (garbage free)之前的版本會產生非常多的臨時對象,會造成GC頻繁,log4j2則在這方面上做了優化,減少產生臨時對象。盡可能少的GC
- 利用插件系統,使得擴展新的appender,filter,layout等變得容易,log4j不可以擴展 插件????
- 因為插件系統的簡單性,所以在配置的時候,可以不用具體指定所要處理的類型。class
- 可以自定義level
- Java 8 lambda support for lazy logging
- Support for Message objects
- 對filter的功能支持的更強大
- 系統日志(Syslog)協議supports both TCP and UDP
- 利用jdk1.5並發的特性,減少了死鎖的發生。
- Socket LogEvent SerializedLayout
- 支持kafka queue
