1. 程式人生 > 其它 >Log4j入門教程

Log4j入門教程

記錄日誌是軟體開發中的重要一環。編寫良好的日誌程式碼能為執行應用提供快速的診斷資訊和良好的儲存結構,方便維護。記錄日誌也有其缺點,它會讓應用變慢。為了減輕這些影響,Log4j 被設計為可靠的,更快的和可擴充套件的。

Log4j 主要由三部分組成:

  • loggers:負責獲取日誌資訊,並存儲於一個分層的名稱空間之中。
  • appenders:負責將日誌資訊釋出到不同地方。比如資料庫、檔案、控制檯等。
  • layouts:負責以各種風格格式化日誌資訊。

log4j.properties 檔案是 Log4j 的配置檔案,預設情況下, LogManager 會在 CLASSPATH 中尋找 Log4j.properties

檔案。下面看個示例

1. 引入依賴檔案

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

Java 中進行呼叫

package com.zuojl.controller;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author ZUOJL-PC
 * @version 2018/11/17 0017 15:01
 */
@Controller
public class IndexController {

    private static final Logger log = Logger.getLogger(IndexController.class);

    @RequestMapping("/")
    @ResponseBody
    public String index() {
        for (String key : System.getProperties().stringPropertyNames()) {
            log.debug(String.format("%s -> %s", key, System.getProperty(key)));
        }
        return "Hello, Log4j";
    }
}

在 resources 目錄下新增 log4j 配置檔案

log4j.rootLogger=DEBUG,console,debug
log4j.logger.org.springframework=ERROR

# console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %x %5p [%t] %C.%M(%F:%L) | %m%n

# debug file
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File=${catalina.home}/logs/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=debug
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n
log4j.appender.debug.encoding=UTF-8

# info file
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File=${catalina.home}/logs/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=debug
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n
log4j.appender.info.encoding=UTF-8

# error file
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File=${catalina.home}/logs/error.log
log4j.appender.error.Append=true
log4j.appender.error.Threshold=debug
log4j.appender.error.Target=System.err
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n
log4j.appender.error.encoding=UTF-8

log4j.properties 的配置資訊的意義:

Loggers

五個級別的順序 DEBUG < INFO < WARN < ERROR < FATAL 。

配置中的 Log4j.(logger|rootLogger).[logger-name]=level, appender1,appender..n 就是將 Appender 物件新增至 Logger 物件中。只有被新增到 Logger 中的 Appender 才會生效。
注意:這裡需要注意的是不要將同一個 Appender 新增到不同的 Logger 中,否則會出現同樣的日誌多次列印的情況,無故消耗伺服器效能。

Appender

常用的 Appender 有如下幾種:

  • org.apache.log4j.ConsoleAppender(控制檯)。
  • org.apache.log4j.FileAppender(檔案)。
  • org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案)。
  • org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)。
  • org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)。

Appender 的一些屬性

  • Threshold=DEBUG(指定日誌訊息的輸出最低層次)。
  • ImmediateFlush=true(預設值是true,意謂著所有的訊息都會被立即輸出)。
  • Target=System.err(預設情況下是:System.out,指定輸出控制檯)。
  • File=${catalina.home}/logs/debug.log(指定訊息輸出到 Tomcat 的 logs 資料夾下的 debug.log 檔案中)。
  • Append=false(預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容)。
  • MaxFileSize=100KB(字尾可以是KB, MB 或者是 GB. 在日誌檔案到達該大小時,將會自動滾動,即將原來的內容移到 debug.log.1 檔案)。
  • MaxBackupIndex=10(指定可以產生的滾動檔案的最大數)。

注意:可以使用 ${} 的形式呼叫變數,如果你沒有定義這個變數的話會取 System.getProperties() 的值。

Layout

最常用的就是 PatternLayout 下面是其引數的意義:

  • %p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL。
  • %d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS}。
  • %r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數。
  • %c: 輸出日誌資訊所屬的類目,通常就是所在類的全名。
  • %t: 輸出產生該日誌事件的執行緒名。
  • %l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的執行緒,以及在程式碼中的行數。
  • %x: 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。
  • %%: 輸出一個"%"字元。
  • %F: 輸出日誌訊息產生時所在的檔名稱。
  • %L: 輸出程式碼中的行號。
  • %m: 輸出程式碼中指定的訊息,產生的日誌具體資訊。
  • %n: 輸出一個回車換行符,Windows平臺為"\r\n",Unix平臺為"\n"輸出日誌資訊換行。

可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。如:

  • %20c: 指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,預設的情況下右對齊。
  • %-20c: 指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,"-"號指定左對齊。
  • %.30c: 指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會有空格。
  • %20.30c: 如果category的名稱小於20就補空格,並且右對齊,如果其名稱長於30字元,就從左邊較遠輸出的字元截掉。