建立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程式
也能追蹤每個使用者的所有操作
以及檢視各個參數與數據
實在是非常重要非常實用的工具