?通過Log4j,我們可以控制日志信息輸送到目的地是控制臺、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器。我們可以控制每一條日志的輸出格式。通過定義每一條日志信息的級別,能更加細致地控制日志的生成過程。
1 log4j、log4j2與@SLF4J
2015年9月,Apache宣布不再維護Log4j。建議所有相關項目升級到Log4j2。Log4j2是Apache開發的一個新的日志框架,改進了Log4j的缺點,同時也借鑒了LogBack,號稱在性能上也完勝LogBack。
log4j | log4j2 | |
配置文件 | 以.properties的文件為主。 | 采用的是.xml,.json或者.jsn |
核心JAR包 | 只需引入一個jar包:log4j | 需要兩個核心包:log4j-core和log4j-api |
配置文件方式 | 兩者基本不同 |
表 log4j與log4j2在用法上的主要區別
SFL4J 全稱是Simple Logging Facade for Java(Java的簡單日志門面),是外觀模式的典型應用。
不同的日志框架,需要引入不同的jar包,及使用不同的代碼獲取Logger。如果項目升級需要更換不同的框架,那么就需要修改所有的地方來獲取新的Logger,這將產生巨大的工作量。
而SFL4J,運用門面外觀模式,提供一個接口,將不同的日志框架的使用統一起來。
圖 SLF4J 的工作原理
2 Log4J
級別標準是:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATA < OFF。
ALL | 所有級別包括自定義級別 | WARN | 用于警告消息。 |
TRACE | 低于DEBUG。 | ERROR | 錯誤消息日志,應用程序可以繼續執行。 |
DEBUG | 調試消息日志。 | FATA | 嚴重錯誤消息日志,必須中止運行程序。 |
INFO | 信息消息。 | OFF | 最高級別,旨在關閉日志記錄。 |
表 Log4j 日志級別說明
圖 log4j的配置文檔結構
配置文檔主要有兩個標簽:<appender>用來配置日志輸出目標的信息。<root>更節點來配置日志輸出級別、輸出目標等信息。
3 appender
log輸出源,常用的輸出源有:ConsoleAppender(控制臺)、FileAppender(文件)、DailyRollingFileAppender(日常日志文件,FileAppender的子類)等。
這些輸出源公有等配置選項有:
1、Threshold,指定日志信息的最低輸出級別,默認DEBUG。
2、ImmediateFlush, 表示所有的消息都會被立即輸出,默認true。
ConsoleAppender | Target,輸出流,默認是System.out。 |
FileAppender | Append,表示增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。 File,當前消息輸出的文件地址 |
DailyRollingFileAppender | DatePattern,輸出頻率,yyy-MM 表示每月產生一個新的日志文件,命名規則是:文件名.后綴.yyyy-MM |
RollingFileAppender | MaxFileSize,文件到達該大小時,將會自動產生一個新的日志文件,后綴可以是KB,MB或者GB。 MaxBackupIndex,可以產生的滾動文件最大數,假如設為2,則可產生app.log.1、app.log.2兩個滾動文件和app.log。 |
表 常見輸出源的相關配置
3.1 layout
配置日志信息的輸出格式的布局。常見的布局有:HTMLLayout(以HTML表格形式布局)、PatternLayout(可以靈活指定布局模式)、SimpleLayout(包含日志信息的級別和信息字符串)、TTCCLayout(包含日志產生的時間、線程、類別等信息)。
%p | 日志信息的優先級,即DEBUG、INFO、WARN等。 | %F | 產生日志消息所在的文件名稱。 |
%d | 輸出日志的時間,其后可以指定格式,如:%d{yyyy-MM-dd HH:mm:ss}。 | %L | 代碼中的行號。 |
%r | 自應用程序啟動到輸出該log信息耗費到毫秒數。 | %m | 輸出代碼中指定的具體消息。比如log.warn(“hello”); 則輸出hello。 |
%t | 產生該日志事件的線程名。 | %n | 一個回車換行符。 |
%l | 日志事件發生位置,相當于%c.%M(%F:%L)的組合,包括類的全名、方法、文件名以及在代碼中的行數。 | %x | 輸出和當前線程相關聯的NDC(嵌套診斷環境)。 |
%c | 產生日志信息所屬的類目。 | %% | 輸出一個%字符。 |
%M | 產生日志信息的方法名。 |
表 PatternLayout 布局格式化符號說明
例如:%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
輸出:
2023-11-22 21:25:43 INFO? ?Application:25 – info
2023-11-22 21:25:43 WARN? Application:26 – warn
%-5 表示左對齊5個字符。
4 輸出實戰
log4j 日志可以輸出到文件、郵件及數據庫等。下面將大致介紹輸出到郵件及文件到用法。
4.1 輸出到郵件
首先,需要添加郵件發送的依賴:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
然后配置appender
圖 郵件appender配置
bufferSize,默認單位是kb。是指日志超過該大小后才會發送郵件(當程序停止時也會發送郵件)。
圖 log4j 發送的日志郵件
4.2 輸出到文件
圖 DailyRollingFileAppender C產生的日志文件
如圖所示,所產生的日志文件并不符合我們的期望,我們想得到的文件是: app.yyyy-MM-dd-HH-mm.log 這種格式的。這時需要我們自定義Appender。
我們需要先分析DailyRollingFileAppender這個類:
產生日志文件是在rollOver()這個方法發生的(這個方法官方注釋是:將當前文件滾動到新文件)。
圖 DailyRollingFileAppender 類的rollOver方法
因為rollOver方法我們沒法重寫,我們的Appender類不能直接繼承DailyRollingFileAppender類。我們重寫CustomDailyRollingFileAppender類,并繼承FileAppender。這個類相對于DailyRollingFileAppender,只需要修改兩處:
圖 修改activateOptions方法
圖 修改rollOver方法
圖 修改后生成的日志文件