首先聲明本文並不教您怎麼用log4j2,僅僅只對<PatternLayout>子節點進行說明。
要看懂本文需要對log4j2有一定的瞭解,至少能夠知道<Appenders>、<Layouts>和<Loggers>的區別。
本文主要參考對象爲log4j2官方手冊:《Apache Log4j 2 v. 2.1 User's Guide》,但是鑑於官方手冊的不少細節描述得並不是非常清楚,甚至還有錯誤,所以還希望大家自己多試驗,畢竟如果官方文檔有錯誤或寫得不清楚,我也沒辦法。
---------------------------------------------這是一條分割線,以下是正文---------------------------------------------------
PatternLayout是最重要也是最常用的控制輸出內容的節點,包括類名、時間、行號、日誌級別、序號等都可以控制,同時還可以指定日誌格式,可以使用正則表達式處理輸出結果。
PatternLayout中包含的特殊字符包括\t,\n,\r,\f,用\\輸出單斜線,用%%輸出%。
下面是PatternLayout的參數
Parameter Name |
Type |
Description |
charset |
String |
輸出的字符集。如果沒有指定,則使用系統默認的字符集輸出。 |
pattern |
String |
詳見後面的pattern的表格 |
replace |
RegexReplacement |
替換部分輸出中的String。這將會調用一個與RegexReplacement轉換器相同的函數,不同的是這是針對整個消息的。 |
alwaysWriteExceptions |
boolean |
默認爲true。總是輸出異常,即使沒有定義異常對應的pattern,也會被附在所有pattern的最後。設爲false則不會輸出異常。 |
header |
String |
可選項。包含在每個日誌文件的頂部。 |
footer |
String |
可選項。包含在每個日誌文件的尾部。 |
noConsoleNoAnsi |
boolean |
默認爲false。如果爲true,且System.console()是null,則不會輸出ANSI轉義碼。 |
下面RegexReplacement參數
Parameter Name |
Type |
Description |
regex |
String |
Java正則表達式 |
replacement |
String |
任何匹配正則規則,被正則替換的後值 |
下面是pattern屬性具體描述(這個表格僅包括了我能看懂的部分,還有很多看不懂並且試驗也不成功的部分我都沒寫。另外用於控制輸出結果顏色的highlight和style我也沒有寫,實在是感覺平時意義不大):
參數名 |
參數意義 |
詳細描述 |
||||||||||||||||||||||||
%c{參數}或%logger{參數} |
輸出logger的名稱,即語句private static final Logger logger = LogManager.getLogger(App.class.getName())中App.class.getName()的值。也可以使用其他字符串。 |
如果不帶參數,則輸出完整的logger名稱;如果參數是整數n(只支持正整數),則先將logger名稱依照小數點(.)分割成n段,然後取右側的n段;如果參數不是整數,則除了最右側的一段,其他整段字符都用這個字符代替,保留小數點;不管怎麼寫,最右側的一段都保持不變。默認不帶參數,並輸出logger的完整名稱。注意:上面的說明寫得很爛,但是官方文檔寫得就這麼爛,而且還不完整,看不懂是必然的,還請看官自己多試驗,纔能有所領會。如果看官自己懶得試驗又看不懂,只能建議不要加參數,直接%c輸出完整值。 示例:
|
||||||||||||||||||||||||
%C{參數}或%class{參數} |
輸出類名。注意,這個是大寫C,上面是小寫c。 |
參數規則與%c完全一樣,請參見上面的說明。 |
||||||||||||||||||||||||
%d{參數}{時區te{參數}{時區 |
輸出時間。 |
第一個大括號數可以是保留關鍵字,也可以是text.SimpleDateFormat字符拼接而成。保留關鍵字有:DEFAULT,ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。 第二個大括號中的參數是java.util.TimeZone.getTimeZone的值,可以設定時區。 示例:
|
||||||||||||||||||||||||
無 |
輸出特殊字符 |
&, <, >, ”, ’全都要使用實體名稱或實體編號替代,即
官方文檔說pattern刪除了\r和\n,但是經我測試可以使用,明顯是官方文檔的錯誤。 |
||||||||||||||||||||||||
%F|%file |
輸出文件名 |
僅僅是文件名稱,如Test.java,不包含路徑名稱 |
||||||||||||||||||||||||
highlight{pattern}{style} |
高亮顯示結果 |
|
||||||||||||||||||||||||
%l |
輸出完整的錯誤位置,如com.future.ourfuture.test.test.App.tt(App.java:13) |
注意1:這個是小寫的L。 注意2:使用該參數會影影響日誌輸出的性能。 |
||||||||||||||||||||||||
%L |
輸出錯誤行號,如“13” |
注意:使用該參數會影響日誌輸出的性能。 |
||||||||||||||||||||||||
%m或%msg或%message |
輸出錯誤信息,即logger.error(String msg)中的msg |
|
||||||||||||||||||||||||
%M或%method |
輸出方法名,如“main”,“getMsg”等字符串 |
|
||||||||||||||||||||||||
%n |
換行符 |
根據系統自行決定,如Windows是”\r\n”,Linux是”\n” |
||||||||||||||||||||||||
%level{參數1}{參數2}{參數3} |
參數1用來替換日誌信息的級別,格式爲:{level=label, level=label, …},即使用label代替的字符串替換level。其中level爲日誌的級別,如WARN/DEBUG/ERROR/TRACE/INFO 參數2表示只保留前n個字符。格式爲length=n,n爲整型。但參數1中指定了label的字符串不受此參數限制 參數3表示結果是大寫還是小寫。參數1指定了label的字符串不受此參數限制。 |
示例:
|
||||||||||||||||||||||||
%r或%relative |
輸出自JVM啓動以來到log事件開始時的毫秒數 |
|
||||||||||||||||||||||||
replace{pattern}{regex}{substitution} |
將pattern的輸出結果,按照正則表達式regex匹配後,使用substitution字符串替換 |
例如:"%replace{%logger }{\.}{/}就是將所有%logger中的小數點(.)全部替換爲斜槓,如果%logger是com.future.ourfuture.test.test.App則輸出爲com/future/ourfuture/test/test/App。pattern中可以寫多個表達式,如%replace{%logger%msg%C}{\.}{/}%n |
||||||||||||||||||||||||
%sn或%sequenceNumber |
自增序號,每執行一次log事件,序號+1,是一個static變量。 |
|
||||||||||||||||||||||||
%t或%thread |
創建logging事件的線程名 |
|
||||||||||||||||||||||||
%u{RANDOM|TIME}或%uuid{RANDOM|TIME} |
依照一個隨機數或當前機器的MAC和時間戳來隨機生成一個UUID |
|
下面是pattern的對齊修飾:
對齊修飾,可以指定信息的輸出格式,如是否左對齊,是否留空格等。
編寫格式爲在任何pattern和%之間加入一個小數,可以是正數,也可以是負數。如%10.20c表示對logger的信息進行處理。%-10.20m表示對message進行處理。
整數表示右對齊,負數表示左對齊;整數位表示輸出信息的最小10個字符,如果輸出信息不夠10個字符,將用空格補齊;小數位表示輸出信息的最大字符數,如果超過20個字符,則只保留最後20個字符的信息(注意:保留的是後20個字符,而不是前20個字符)。
下面是一些示例。
格式 |
是否左對齊 |
最小寬度 |
最大寬度 |
說明 |
%20 |
右對齊 |
20 |
無 |
右對齊,不足20個字符則在信息前面用空格補足,超過20個字符則保留原信息 |
%-20 |
左對齊 |
20 |
無 |
左對齊,不足20個字符則在信息後面用空格補足,超過20個字符則保留原信息 |
%.30 |
不對齊 |
無 |
30 |
如果信息超過30個字符,則只保留最後30個字符 |
%20.30 |
右對齊 |
20 |
30 |
右對齊,不足20個字符則在信息前面用空格補足,超過30個字符則只保留最後30個字符 |
%-20.30 |
左對齊 |
20 |
30 |
左對齊,不足20個字符則在信息後面用空格補足,超過30個字符則只保留最後30個字符 |