日志框架有哪些 java開發日志規范



文章插圖
日志框架有哪些 java開發日志規范

文章插圖
功能簡介
上一篇介紹了為什么打印日志、什么時候打印日志以及怎么打印日志 。本篇介紹下在項目開發中常見的日志組件以及關系 。
先看一張圖
接口:將所有日志實現適配到了一起 , 用統一的接口調用 。
實現:目前主流的日志實現 。
日志門面
SLF4J
SLF4J , 即簡單日志門面(Simple Logging Facade for Java) , 不是具體的日志解決方案 , 而是通過Facade Pattern提供一些Java logging API , 它只服務于各種各樣的日志系統 。按照官方的說法 , SLF4J是一個用于日志系統的簡單Facade , 允許最終用戶在部署其應用時使用其所希望的日志系統 。
例子
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
private static Log logger = LogFactory.getLog(this.getClass());
}
slf4j靜態綁定原理:SLF4J 會在編譯時會綁定org.slf4j.impl.StaticLoggerBinder; 該類里面實現對具體日志方案的綁定接入 。任何一種基于slf4j 的實現都要有一個這個類 。如:org.slf4j.slf4j-log4j12-1.5.6: 提供對 log4j 的一種適配實現 。注意:如果有任意兩個實現slf4j 的包同時出現 , 那么就可能出現問題(mvn dependency:tree排查) 。
common-logging
common-logging,是apache提供的一個通用的日志接口 。用戶可以自由選擇第三方的日志組件作為具體實現 , 像log4j , 或者jdk自帶的logging ,  common-logging會通過動態查找的機制 , 在程序運行時自動找出真正使用的日志庫
common-logging動態查找原理:Log 是一個接口聲明 。LogFactory 的內部會去裝載具體的日志系統 , 并獲得實現該Log 接口的實現類 。LogFactory 內部裝載日志系統的流程如下:
首先 , 尋找org.apache.commons.logging.LogFactory 屬性配置 。利用JDK1.3 開始提供的service 發現機制 , 會掃描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory文件 , 若找到則裝載里面的配置 , 使用里面的配置 。從Classpath 里尋找commons-logging.properties  , 找到則根據里面的配置加載 。使用默認的配置:如果能找到Log4j 則默認使用log4j 實現 , 如果沒有則使用JDK14Logger 實現 , 再沒有則使用commons-logging 內部提供的SimpleLog 實現 。
從上述加載流程來看 , 只要引入了log4j 并在classpath 配置了log4j.xml  , 則commons-logging 就會使log4j 使用正常 , 而代碼里不需要依賴任何log4j 的代碼 。
slf4j 與 common-logging 比較
common-logging通過動態查找的機制 , 在程序運行時自動找出真正使用的日志庫 。由于它使用了ClassLoader尋找和載入底層的日志庫 ,  導致了象OSGI這樣的框架無法正常工作 , 因為OSGI的不同的插件使用自己的ClassLoader 。OSGI的這種機制保證了插件互相獨立 , 然而卻使Apache Common-Logging無法工作 。
slf4j在編譯時靜態綁定真正的Log庫,因此可以再OSGI中使用 。另外 , SLF4J 支持參數化的log字符串 , 避免了之前為了減少字符串拼接的性能損耗而不得不寫的if(logger.isDebugEnable()) , 現在你可以直接寫:logger.debug(“current user is: {}”, user) 。拼裝消息被推遲到了它能夠確定是不是要顯示這條消息的時候 , 但是獲取參數的代價并沒有幸免 。
常見日志實現
Log4j
2種配置文件、3個主要組件、7種日志級別
Log4j是Apache的一個開放源代碼項目 , 通過使用Log4j , 可以控制日志信息輸送的目的地是控制臺、文件、數據庫等;也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別 , 我們能夠更加細致地控制日志的生成過程 。
Log4j有7種不同的log級別 , 按照等級從低到高依次為:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF 。如果配置為OFF級別 , 表示關閉log 。
Log4j支持兩種格式的配置文件:properties和xml 。包含三個主要的組件:Logger、appender、Layout 。
Log4j2
log4j2和log4j是一個作者 , 只不過log4j2是重新架構的一款日志組件 , 他拋棄了之前log4j的不足 , 以及吸取了優秀的logback的設計重新推出的一款新組件 。
1. 插件式結構 Log4j 2支持插件式結構 。我們可以根據自己的需要自行擴展Log4j 2. 我們可以實現自己的appender、logger、filter 。2. 配置文件優化 在配置文件中可以引用屬性 , 還可以直接替代或傳遞到組件 。而且支持json格式的配置文件 。不像其他的日志框架 , 它在重新配置的時候不會丟失之前的日志文件 。3. Java 5的并發性 Log4j 2利用Java 5中的并發特性支持 , 盡可能地執行最低層次的加鎖 。解決了在log4j 1.x中存留的死鎖的問題 。4. 異步logger Log4j 2是基于LMAX Disruptor庫的 。在多線程的場景下 , 和已有的日志框架相比 , 異步的logger擁有10倍左右的效率提升 。
LogBack
Logback是由log4j創始人設計的又一個開源日記組件 。logback當前分成三個模塊:logback-core,logback- classic和logback-access 。logback-core是其它兩個模塊的基礎模塊 。logback-classic是log4j的一個 改良版本 。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日記系統如log4j或JDK14 Logging 。logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日記的功能 。
Log4j 與 LogBack 比較
【日志框架有哪些 java開發日志規范】LogBack作為一個通用可靠、快速靈活的日志框架 , 將作為Log4j的替代和SLF4J組成新的日志系統的完整實現 。LOGBack聲稱具有極佳的性能 , “ 某些關鍵操作 , 比如判定是否記錄一條日志語句的操作 , 其性能得到了顯著的提高 。這個操作在LogBack中需要3納秒 , 而在Log4J中則需要30納秒 。LogBack創建記錄器(logger)的速度也更快:13微秒 , 而在Log4J中需要23微秒 。更重要的是 , 它獲取已存在的記錄器只需94納秒 , 而 Log4J需要2234納秒 , 時間減少到了1/23 。跟JUL相比的性能提高也是顯著的” 。
備注常見組合slf4j+logbackslf4j+log4j2