Log4j簡易教學(Java)

建立LOG檔(記錄檔),可以協助使用者記錄程式執行間的所有過程,以及記錄一些重要的數值

所以對程式來說是個不可或缺的工具

而建立LOG檔常見的方式,為寫入DB以及建立文字檔

這裡要介紹的是在Java中使用Log4j來建立Log文字檔

首先取得log4j的jar檔,這裡是使用log4j-1.2.17.jar

另外還要建立參數設定檔給Log4j,可以使用兩種格式設定參數,分別為XML和properties格式的檔案

以下使用properties格式講解

 

完整設定檔內容,檔名必須為log4j. properties:

(若不想看解說可以直接複製使用,並跳到最下面看如何埋Log)

# Root logger option
log4j.rootLogger=DEBUG, consoleout, fileout


# Redirect log messages to console
log4j.appender.consoleout=org.apache.log4j.ConsoleAppender
log4j.appender.consoleout.Target=System.out
log4j.appender.consoleout.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c:%L - %m%n


# Redirect log messages to a log file
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=C:/testlogs/myapp.log
log4j.appender.fileout.MaxFileSize=5MB
log4j.appender.fileout.MaxBackupIndex=10
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

 

1.建立根Logger

log4j.rootLogger=DEBUG, consoleout, fileout

第一個參數為記錄訊息的層級,由高至低分別為Fatal、Error、Warn、Info、Debug

而參數設定的層級,只會輸出該層級以上的訊息

例如設定Info會輸出[Fatal、Error、Warn、Info],設定Error會輸[Fatal、Error],以此類推

另外還有OFF(全不使用),ALL(全使用)兩個設定值

第二個參數開始為Appender的名稱,不限個數,用逗號區隔

 

2.建立Log輸出目的地(Appender)

常用的Appender有以下幾種:

(1)org.apache.log4j.ConsoleAppender(控制台輸出,其實就是System.out和System.err)

(2)org.apache.log4j.FileAppender(建立檔案)

(3)org.apache.log4j.DailyRollingFileAppender(固定周期建立一個Log檔,預設為每天建立一個檔案)

(4)org.apache.log4j.RollingFileAppender(可以限制每個LOG檔的大小,若超過限制則建立新的LOG檔)

(5)org.apache.log4j.WriterAppender(將Log以Writer或Stream的格式傳到指定的地方)

 

可以依據自己的需求使用不同的Appender,最常使用的是RollingFileAppender

若在本機上測試還可以使用ConsoleAppender

不管是一般的Java程式,或是搭配Tomcat等伺服器的Web應用程式,都可以在Eclipse中的Console頁簽內看到Log訊息

 

之後因為不同的Appender會有不同的參數設定,所以接下來主要介紹ConsoleAppender和RollingFileAppender

 

3.參數設定

(1) ConsoleAppender


log4j.appender.consoleout.Target=System.out 

使用何種輸出,另一個參數值就是System.err

 

log4j.appender.consoleout.layout=org.apache.log4j.PatternLayout

使用何種格式記錄LOG

有DateLayout、HTMLLayout 、PatternLayout、SimpleLayout、XMLLayout五種參數值

一般情況下使用PatternLayout即可。

 

log4j.appender.consoleout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c:%L- %m%n

若設定layout為PatternLayout的話,可以設定layout.ConversionPattern屬性

該屬性用來設定輸出Log字串的格式,常用的值為:

 

d: 輸出日期時間,後面大括弧裡放日期自串格式(ISO8601)

p: 輸出訊息等級

c: 輸出Log訊息所在的類別

L: 輸出Log訊息所在的程式碼的行數(L大寫只會輸出行號,小寫會輸出包含行數的訊息)

m: 輸出實際內容

n: 換行符號

 

還可以在%與模式字元之間加上修飾符號,控制寬度與對齊等格式,例如:

log4j.appender.fileout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

其中的%-5p為靠左對齊共5格,%c{1}為輸出類別的一個層級(假設類別為a.b.c,則會輸出c)

 

(2) RollingFileAppender

這裡有部分和ConsoleAppender一樣,所以只介紹不一樣的部分

 

log4j.appender.fileout.File=C:/testlog/test.log

指定Log輸出的位置,這裡需使用log為附檔名

 

log4j.appender.fileout.MaxFileSize=5MB

限制每個Log檔的大小,若超過則建立新的Log

舊的Log檔的副檔名後面會自動加上數字1、2……以此類推

 

log4j.appender.fileout.MaxBackupIndex=10

副檔名後面的數字上限,達到該上限後就不會再生成新的Log檔

這裡設定10的話,最後會有1到10再加上沒有數字的檔案,所以共有11個

 

另外還有幾個常見的共通設定:

Threshold:指定日誌訊息的輸出最低層級

Append:將訊息加到指定的檔案中,預設值為true,若為false則指定的檔案內容會被新的訊息覆蓋掉

Encoding:設定輸出編碼

ImmediateFlush:Log訊息是否會立即輸出,預設為true,若為false則程式執行完畢後再一次輸出

 

 

以上為基本的log4j.properties設定,接下來就是在程式碼內埋Log:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Test {

    //傳入目前類別名稱,封裝等級自訂
    private static final Logger logger = Logger.getLogger(Test.class);   

    public static void main(String[] args) {        

         //傳入log4j.properties路徑
         PropertyConfigurator.configure("C:\\fakepath\\log4j.properties");

         logger.debug("Hello World");    //debug層級
         logger.info("Hello World2");    //info層級
         logger.warn("Hello World3");    //warn層級
         logger.error("Hello World4");    //error層級
         logger.fatal("Hello World5");    //fatal層級
    }
}

 

這裡有兩點要注意:

1. Logger.getLogger()裡面要放入目前所在類別的名稱,這樣該類別才能使用logger

2.可以透過PropertyConfigurator.configure()方法,告訴logger要去參考哪個設定檔

而正常情況下並不會把參考位置寫在程式碼內

而是在編譯或是打包成War檔時,將log4j.properties一起包進去

 

輸出結果

2021-01-06 15:17:37 DEBUG Test:12 - Hello World
2021-01-06 15:17:37 INFO  Test:13 - Hello World2
2021-01-06 15:17:37 WARN  Test:14 - Hello World3
2021-01-06 15:17:37 ERROR Test:15 - Hello World4
2021-01-06 15:17:37 FATAL Test:16 - Hello World5

 

以上是簡易的Log4j教學

而更重要的其實是埋 Log的技巧

若Log埋得好,開發中能更快找出問題所在

大大降低Debug所需的時間

而在運行中的Web程式

也能追蹤每個使用者的所有操作

以及檢視各個參數與數據

實在是非常重要非常實用的工具