Log4j 是 Java 領域最經典的日誌框架。本文系統梳理配置文件語法、初始化方式、多 Appender 協同輸出及級別控制技巧,助你快速構建生產級日誌體系。
Log4j 配置採用鍵值對形式,三大核心組件:
# 1. 根 Logger 配置
log4j.rootLogger = [level], appenderName1, appenderName2, ...
# 2. Appender 配置(輸出目的地)
log4j.appender.appenderName = fully.qualified.class.name
log4j.appender.appenderName.option1 = value1
...
# 3. Layout 配置(輸出格式)
log4j.appender.appenderName.layout = fully.qualified.class.name
log4j.appender.appenderName.layout.option1 = value1
...
| 級別 | 數值 | 適用場景 |
|---|---|---|
| FATAL | 0 | 導致應用崩潰的嚴重錯誤 |
| ERROR | 3 | 業務流程中斷、異常捕獲 |
| WARN | 4 | 潛在問題、接近閾值預警 |
| INFO | 6 | 關鍵業務節點、狀態變更 |
| DEBUG | 7 | 開發調試、詳細執行軌跡 |
ConsoleAppender:控制台輸出FileAppender:固定文件輸出DailyRollingFileAppender:按天滾動生成文件RollingFileAppender:按文件大小滾動WriterAppender:流式輸出至任意目標PatternLayout:靈活模式(推薦)HTMLLayout:HTML 表格格式SimpleLayout:級別+信息TTCCLayout:時間、線程、類別等詳細信息| 符號 | 含義 |
|---|---|
| %m | 代碼中指定的消息 |
| %p | 優先級 |
| %r | 啟動到輸出耗時(毫秒) |
| %c | 類目全名 |
| %t | 線程名 |
| %n | 換行符 |
| %d | 時間(可指定格式,如 %d{yyyy-MM-dd HH:mm:ss,SSS}) |
| %l | 發生位置(類.方法:行號) |
BasicConfigurator.configure():快速啟用控制台輸出,格式固定,級別 DEBUGPropertyConfigurator.configure(args[x]):命令行參數指定配置文件實戰場景:普通日志輸出到 log.log,異常日志單獨輸出到 error.log。
### 根 Logger 掛載三個 Appender
log4j.rootLogger = debug, stdout, D, E
### 控制台輸出
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 普通日誌文件(DEBUG 及以上)
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
### 異常日誌文件(ERROR 及以上)
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
public class TestLog4j {
public static void main(String[] args) {
PropertyConfigurator.configure("D:/Code/conf/log4j.properties");
Logger logger = Logger.getLogger(TestLog4j.class);
logger.debug("debug message");
logger.error("error message");
}
}
運行後,debug 同時出現在控制台與 log.log,error 額外出現在 error.log,實現分級存儲。
INFO 或 WARN,避免 DEBUG 級別日誌佔磁盤traceId 便於鏈路追蹤