1. 程式人生 > >Java的記錄日誌(log4j)

Java的記錄日誌(log4j)

 

為什麼要寫日誌?

1.在程式開發過程中,方便除錯,並且方便發現程式執行時的錯誤資訊。

2.在生產環境時,方便排除問題。

3.可以業務資料,以便後期對資料分析

 

實現方式

使用log4j,通過配置,將日誌輸出到控制檯,檔案,資料庫。(因為該文章只是說明對log4j的使用,所有不涉及其它日誌類庫)

 

該專案使用的是maven專案,所以直接通過pom引入依賴包

        <!-- 日誌 -->
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

 

新增一個類,做為列印日誌的測試

package com.kevin.log;

import org.apache.log4j.Logger;

/**
 * @author kevin
 * @version 1.0
 * @description     將日誌的各種級別輸出到控制檯與檔案
 * @createDate 2018/12/29
 */
public class Log4jDemo {

    public static Logger logger = Logger.getLogger(Log4jDemo.class);

    public static void main(String[] args) {

        for (int i = 0; i < 10000; i++) {
            // 日誌的級別從低到高
            // 很低的日誌級別一般不會使用
            logger.trace("logger的trace級別");
            // 細粒度資訊對除錯應用非常有幫助,主要列印一些執行資訊
            logger.debug("logger的debug級別");
            // 粗粒度突出強調應用程式的執行過程,列印感興趣或者重要的資訊
            logger.info("logger的info級別");
            // 表明會出現潛在錯誤的情形,有些資訊不是錯誤資訊,但也要給程式設計師一點提示
            logger.warn("logger的warn級別");
            // 指出雖然發生錯誤,但不影響執行,列印錯誤和異常資訊,如果不想輸出太多日誌可以使用該級別
            logger.error("logger的error級別");
            // 每個嚴重的錯誤事件將會導致應用程式的退出,出現錯誤可以停止程式執行進行除錯
            logger.fatal("logger的fatal級別");
        }

    }
}

 

新增log4j.properties日誌配置檔案

 

1.將日誌輸出到控制檯

#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console

#Console  輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

 

控制檯輸出的內容

 

2.將日誌檔案追加到檔案和控制檯(這個的缺點,是一直追加到同一個檔案中,最後檔案會無比的大)

#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console,File

#Console  輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#輸出到檔案(一直輸出到該檔案中)
log4j.appender.File = org.apache.log4j.FileAppender
#輸出日誌檔案路徑
log4j.appender.File.File = E:\\log\\JavaBean_log\\File.log
#包含日誌產生的時間、執行緒、類別等等資訊
log4j.appender.File.layout = org.apache.log4j.TTCCLayout
#日誌檔案輸出格式
log4j.appender.File.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n

 

檔案中的內容

 

3.輸出日誌到控制檯和檔案(根據設定的檔案大小限定,達到限定大小則備份,指定備份數量,超出則覆蓋)的日誌配置

 

#3.輸出日誌到控制檯和檔案(根據設定的檔案大小限定,達到限定大小則備份,指定備份數量,超出則覆蓋)的日誌配置
#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console,KEVIN

#Console  輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#輸出到檔案(根據設定的檔案大小限定,達到限定大小則備份,指定備份數量,超出則覆蓋)
log4j.appender.KEVIN = org.apache.log4j.RollingFileAppender
#輸出檔案路徑
log4j.appender.KEVIN.File =E:\\log\\JavaBean_log\\RollingFile.log
#日誌檔案限定大小
log4j.appender.KEVIN.MaxFileSize=1MB
#日誌檔案備份數量上限
log4j.appender.KEVIN.MaxBackupIndex=10
#以HTML表格形式佈局
log4j.appender.KEVIN.layout = org.apache.log4j.PatternLayout
#日誌檔案輸出格式
log4j.appender.KEVIN.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n

 

檔案中的內容

 

4.輸出日誌到控制檯和檔案(每天生成一個日誌檔案)的日誌配置

#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console,DailyRollingFile

#Console  輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#輸出到檔案(根據設定的日期格式,每天生成一個檔案)
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender
#輸出日誌檔案路徑
log4j.appender.DailyRollingFile.File = E:\\log\\JavaBean_log\\DailyRollingFile.log
#日誌檔案生成周期,當前為每天生成一個檔案
log4j.appender.DailyRollingFile.DatePattern = '.'yyyy-MM-dd_HH_mm
#靈活指定日誌格式
log4j.appender.DailyRollingFile.layout = org.apache.log4j.PatternLayout
#日誌檔案輸出格式
log4j.appender.DailyRollingFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n

日誌檔案內容

 

日誌中輸出格式,各種引數配置

%p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c: 輸出日誌資訊所屬的類目,通常就是所在類的全名
%t: 輸出產生該日誌事件的執行緒名
%l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
%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字元,就從左邊交遠銷出的字元截掉。

根據日期週期生成日誌檔案的引數

  • ’.’yyyy-MM: 每月
  • ’.’yyyy-ww: 每週
  • ’.’yyyy-MM-dd: 每天
  • ’.’yyyy-MM-dd-a: 每天兩次
  • ’.’yyyy-MM-dd-HH: 每小時
  • ’.’yyyy-MM-dd-HH-mm: 每分鐘

 

日誌級別

// 日誌的級別從低到高
trace:很低的日誌級別一般不會使用
debug:細粒度資訊對除錯應用非常有幫助,主要列印一些執行資訊
info:粗粒度突出強調應用程式的執行過程,列印感興趣或者重要的資訊
warn:表明會出現潛在錯誤的情形,有些資訊不是錯誤資訊,但也要給程式設計師一點提示
error:指出雖然發生錯誤,但不影響執行,列印錯誤和異常資訊,如果不想輸出太多日誌可以使用該級別
fatal:每個嚴重的錯誤事件將會導致應用程式的退出,出現錯誤可以停止程式執行進行除錯

log4j的配置檔案

1. Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種的proerties格式的檔案,根據自己的愛好使用檔案格式

2. log4j.rootLogger=[level],appenderName,appenderName....

level:是日誌級別,優先順序從高到低是fatal,error,warn,info,debug,trace

appenderName:指定日誌輸出的目的地,可以指定多個目的地。

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

3.appender的配置引數

(1).ConsoleAppender選項

Threshold=WARN:指定日誌訊息的輸出最低層次。

ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。

Target=System.err:預設情況下是:System.out,指定輸出控制檯

(2).FileAppender 選項

Threshold=WARN:指定日誌訊息的輸出最低層次。

ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。

File=mylog.txt:指定訊息輸出到mylog.txt檔案。

Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。

(3).DailyRollingFileAppender 選項

Threshold=WARN:指定日誌訊息的輸出最低層次。

ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。

File=mylog.txt:指定訊息輸出到mylog.txt檔案。

Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。

DatePattern=’.’yyyy-ww:每週滾動一次檔案,即每週產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下:

  • ’.’yyyy-MM: 每月
  • ’.’yyyy-ww: 每週
  • ’.’yyyy-MM-dd: 每天
  • ’.’yyyy-MM-dd-a: 每天兩次
  • ’.’yyyy-MM-dd-HH: 每小時
  • ’.’yyyy-MM-dd-HH-mm: 每分鐘

(4).RollingFileAppender 選項

Threshold=WARN:指定日誌訊息的輸出最低層次。

ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。

File=mylog.txt:指定訊息輸出到mylog.txt檔案。

Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。

MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日誌檔案到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1檔案

MaxBackupIndex=2:指定可以產生的滾動檔案的最大數。

 

Log4j提供的layout:

org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊) 

關於Additity:

它是 子Logger 是否繼承 父Logger 的 輸出源(appender) 的標誌位。具體說,預設情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裡輸出。若是additivity設為false,則子Logger只會在自己的appender裡輸出,而不會在父Logger的appender裡輸出。