5款Java開源日誌框架大比拼
應用系統中,日誌是不可缺少的重要組成部分,所有的應用的出錯資訊等都應該能在日誌檔案中查詢到,有的應用系統日誌可能數量很小,有的龐大的應用系統的日誌是相當龐大,同時日誌檔案必須是方便使用者定製和查詢的,要具備很高的效能,否則會影響應用系統的效能。
由 於日誌通常涉及到IO讀寫磁碟(或者是阻塞或者是非同步),這都要耗費時間。當在大型系統中有大量資料的時候,日誌所耗費的時間就會顯現。在本文中,將深入 探討目前Java開源世界中領先的五個日誌框架,在各個方面進行比較,要指出的是,本文並不是探究哪個日誌框架是最優秀的,而只是列出各自的優缺點。
我們選取的五個日誌框架分別為:
1. log4j
2. Log4J2
3. Logback
4. SLF4J Simple Logging (SLF4J SL)
5. Java Util Logging (JUL)
我們想對比下這些日誌框架對於基本的日誌記錄活動的效能如何,每一個日誌操作包括時間戳和其上下文的程式ID。我們進行如下四個方面的測評:
1.記錄字串常量
2. Logging the .toString() value of a POJO 對POJO使用.toString()方法
3. Logging a throwable object 記錄throwable物件4 只測試.toString()方法
我們決定為每種場景進行五次的評測,通過衡量完成日紙記錄的操作次數,以決定哪一個有最佳的成績。在每次測試中讓日誌引擎在一分鐘內使用10個執行緒去執行,並且剔除最大的2次偏差,將餘下的三次進行平均。
在每一個單獨的日誌記錄操作中,我們讓CPU在日誌記錄的時候都執行一些操作(如檢查是否一個隨機數是否素數)。這些評測的日誌引擎都使用各自的預設配置通過SLF4J來執行。評測是在Amazon m1.large EC2例項上進行的。
在 Log4j2的剛開始的測試中,我們設定了%C的佈局引數(參考:http://logging.apache.org/log4j/2.x /manual/layouts.html),這增加了其開銷,在@RemkoPopma的建議下,我們更新了設定為%c(日誌的名稱)以符合其他的配 置,這給Log4j2一個效能相當大的提升,在下面兩個圖中,值得注意的是記錄上下文的效能開銷。
使用%C的設定:
使用%C的設定:
完整的測試結果集參考這個連結:https://docs.google.com/spreadsheet/ccc?key=0Alceaf46X4GPdHBoLTdYQ29nRDh6V1dRY00zT1FwWWc&usp=sharing
下面對基於4個場景的測試結果進行具體分析:
一 字串常量
在 這輪比拼中,需要日誌引擎使用執行緒和時間戳上下文去記錄字串常量。Log4j是冠軍,比JUL能多寫270%的日誌行,比logback多12.5%, 比SLF4J SL多52%。有趣的是在我們改變log4j2的配置前,它寫的行數能是比改變後的1/4左右,在更改配置後,效能排在第三位,只比logback記錄的 行數少30%。
二.toString()
在 這輪比拼中記錄的是POJO(使用其.toString方法),同樣使用的是執行緒和時間戳。結果中,對於Log4j2來說,和第一回合差不多,但相比 SLF4J SL有25%的效能提升。Log4j和Logback是並駕齊驅的,位居第三,其吞吐量是SLF4J SL的88%。
三.Throwable
在這輪比拼中,日誌引擎記錄異常的物件和相關的描述資訊。其中Log4j2是位居首位,其效能比SLF4J SL高3倍,SLF4J SL位於第五位。
而Log4j和Logback也是隻能排在此輪的冠軍之後,記錄的行數只大概有冠軍的一半,而第二位的反而是JUL,能記錄冠軍Log4j2的日誌量的大概82%。
四.toString()方法比拼
當 處理伺服器日誌的時候,每一個日誌項的上下文(例如執行緒ID,類的相關上下文,時間戳等等)都是和日誌內容一樣重要。在之前的測試中,使用的是在大多數日 志檔案中常見的標誌――執行緒ID號和時間戳。接下來我們認為值得去分析單純在日誌中使用.toString()方法的效能。
這個時候,Log4j2是贏家(如果改變配置,能獲得180%的效能提升),贏出Logback和JUL 大概25%。SL4FJ SL則落敗。在每輪的五次測試中,SLF4J SL在啟用appenders的時候效能比不啟用要好。
Log4j在吞吐量上有15%的增加。JUL在這輪比拼中比不上Log4j和Log4j2,其結果和不使用上下文資料是一樣的。
本文的測試程式碼可以在https://github.com/takipi/the-logging-olympics中下載。
譯文來源:51cto 廖煜嶸譯
相關文章
- 開源日誌框架TNT4J · GitHub框架Github
- 萬字長文帶你瞭解Java日誌框架使用Java日誌框架Java框架
- Java日誌框架演化歷史Java框架
- 掌握Java各種日誌框架Java框架
- Java 日誌框架 LogbackJava框架
- Java日誌框架那些事兒Java框架
- [Java/日誌] 日誌框架列印應用程式日誌程式碼的執行情況Java框架
- java 日誌脫敏框架 sensitive,優雅的列印脫敏日誌Java框架
- 帶你掌握Java各種日誌框架Java框架
- Java日誌框架:logback詳解Java框架
- 主流開源OLAP引擎大比拼
- flask 框架日誌Flask框架
- Java日誌框架:SLF4J詳解Java框架
- Java常用的日誌框架對比和分析Java框架
- 最好用的開源日誌分析工具
- 日誌框架學習框架
- EDP .Net開發框架--自動化日誌框架
- 位元組開源RPC框架Kitex的日誌庫klog原始碼解讀RPC框架原始碼
- 5 個有用的開源日誌分析工具
- GoAccess 開源日誌輕工具部署與分析Go
- SpringBoot 日誌框架Spring Boot框架
- 日誌採集框架Flume框架
- RPC框架大比拼RPC框架
- Java 開發中常用的日誌模組Java
- Java面試寶典之開源框架!Java面試框架
- 5款Java微服務開源框架Java微服務框架
- Java開源框架發展的遐想Java框架
- 開源元件ELK日誌系統配置與管理元件
- 我開源的Android日誌收集器Android
- 開源資料庫:MySQL與PostgreSQL大比拼資料庫MySql
- Java日誌框架:slf4j作用及其實現原理Java框架
- X-Admin&ABP框架開發-系統日誌框架
- 日誌框架SLF4J框架
- jdon框架日誌資訊錯誤框架
- delphi xe 好用的日誌框架框架
- JAVA GC日誌分析JavaGC
- Java 開源分散式快取框架EhcacheJava分散式快取框架
- 比較開源日誌:Logstash、FluentD 和 Fluent Bit