Java日誌系統研究

基本功能

  1. 支持多個等級的日誌打印:trace,debug,warning,error等等
  2. 支持按照不一樣的包名指定不一樣的等級
  3. 支持設置全局的默認日誌等級
  4. 打印日誌到單個或者多個文件,文件能夠按指定大小或者按天進行滾動。

高級功能

NDC

NDC(Nested Diagnostic Context,嵌套診斷上下文)是基於棧的思想,信息能夠被放到棧上或者從棧中移除。而棧中的值能夠被Logger訪問,而且Logger無需顯式想日誌方法中傳入任何值。 代碼示例:html

String username = "admin";
String sessionID = "1234";
NDC.push(username);
NDC.push(sessionID);
try {
  // tmpFile doesn't exist, causing an exception.
  FileReader fr = new FileReader("tmpFile");
}
catch (Exception ex) {
  logger.error("Unable to open file.");
}
finally {
  NDC.pop();
  NDC.pop();
  NDC.remove();
}

Log4j的PatternLayout類經過%x轉換字符從NDC中提取值。 代碼配套配置:java

<PatternLayout pattern="%x %-5p - %m%n" />

獲得的結果:git

admin 1234 ERROR – Unable to open file.

MDC

MDC(Mapped Diagnostic Context,映射調試上下文),是 log4j 和 logback 提供的一種方便在多線程條件下記錄日誌的功能。 MDC 能夠當作是一個與當前線程綁定的哈希表,能夠往其中添加鍵值對。MDC 中包含的內容能夠被同一線程中執行的代碼所訪問。當前線程的子線程會繼承其父線程中的 MDC 的內容。當須要記錄日誌時,只須要從 MDC 中獲取所需的信息便可。MDC 的內容則由程序在適當的時候保存進去。對於一個 Web 應用來講,一般是在請求被處理的最開始保存這些數據。web

代碼示例:spring

public class MdcSample { 
    private static final Logger LOGGER = Logger.getLogger("mdc"); 
    public void log() { 
        MDC.put("username", "Alex"); 
        if (LOGGER.isInfoEnabled()) { 
            LOGGER.info("This is a message."); 
        } 
    } 
 }

配套的配置示例:apache

log4j.appender.stdout.layout.ConversionPattern=%X{username} %d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n

將日誌發送到syslog

SyslogAppenders將日誌記錄發送給本地或者遠程系統的日誌服務。syslog是一個接收日誌事件服務,這些日誌事件來自操做系統、進程、其它服務或者其它設備。 Log4j和Logback都內置支持SyslogAppenders。在Log4j中,咱們建立SyslogAppender時,須要指定syslog服務監聽的主機號、端口號以及協議。下面的示例演示瞭如何設定裝置:api

<Appenders>
  <Syslog name="SyslogAppender" host="localhost" port="514" protocol="UDP" facility="Auth" />
</Appenders>

在Logback中,咱們能夠實現一樣的效果:session

<appender name="SyslogAppender" class="ch.qos.Logback.classic.net.SyslogAppender">
  <syslogHost>localhost</syslogHost>
  <port>514</port>
  <facility>Auth</facility>
</appender>

動態設置日誌等級

  1. 經過spring中的Log4jConfigListener,指定log4jConfigLocation和log4jRefreshInterval,例如:多線程

    <context-param>
         <param-name>log4jConfigLocation</param-name>
         <param-value>classpath:log4j.xml</param-value>
     </context-param>
     <context-param>
         <param-name>log4jRefreshInterval</param-name>
         <param-value>60000</param-value>
     </context-param>
     <listener>
         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
     </listener>

    這樣spring會定時檢查配置文件,而後更新日誌等級。app

    而Logback的參數中自帶了一個定時掃描的參數,開箱即用。

  2. 對外暴漏接口,好比web接口。經過調用日誌框架的API,運行時改變日誌等級。例如:

    org.apache.log4j.Logger#setLevel(level:org.apache.log4j.Level)
     ch.qos.logback.classic.Logger(level:ch.qos.logback.classic.Level)

    注意改變等級前要先記錄下原來的等級,要提供reset功能,回退到原始狀態。

  3. 經過JMX調用更改。

各個日誌框架之間的關係

純接口抽象框架:

  1. JCL(Jakarta commons logger),日誌接口,自帶簡單實現。apache社區的項目。
  2. SLF4J(Simple Logging Facade for Java),日誌接口。

具備實現的框架:

  1. JUL(java util logger),JDK1.4以後提供的日誌api。
  2. log4j,歷史悠久,功能強大,使用普遍的一個日誌庫。不過性能不高,聽說如今已經中止維護了。
  3. logback,是由log4j創始人設計的又一個開源日誌組件。算是log4j的改良版,而且其實現了SLF4J API,意味着能夠支持全部使用SLF4J的程序。
  4. log4j2,看名字就知道是log4j的後續升級版,同歸於apache社區。受益於來自LMAX的Disruptor框架,log4j2在性能上有了很大提高,聽說比log4j,logback都好。

轉換

  1. JCL轉換爲SLF4J

    commons-logging#commons-logging -> org.slf4j#jcl-over-slf4j
  2. SLF4J轉換爲JCL

    org.slf4j#slf4j-api -> org.slf4j#slf4j-jcl

適配

  1. JCL適配log4j

    commons-logging#commons-logging -> log4j#log4j
  2. JCL適配logback

    commons-logging#commons-logging -> org.slf4j#jcl-over-slf4j -> ch.qos.logback#logback-classic
  3. JCL適配log4j2

    commons-logging#commons-logging -> org.apache.logging.log4j#log4j-jcl -> org.apache.logging.log4j#log4j-core
  4. SLF4J適配log4j

    org.slf4j#slf4j-api -> org.slf4j#slf4j-log4j12 -> log4j#log4j
  5. SLF4J適配logback

    org.slf4j#slf4j-api -> ch.qos.logback#logback-classic
  6. SLF4J適配log4j2

    org.slf4j#slf4j-api -> org.apache.logging.log4j#log4j-slf4j-impl -> org.apache.logging.log4j#log4j-core

轉換與適配示例代碼

參考資料

  1. Java 日誌管理最佳實踐
  2. Java日誌終極指南
  3. Log4jConfigListener動態改變記錄級別及實現
  4. 動態修改log4j日誌級別
  5. jdk-logging、log4j、logback日誌介紹及原理
相關文章
相關標籤/搜索