log4j2子節點淺析

首先聲明本文並不教您怎麼用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輸出完整值。

示例:

pattern表達式

logger名稱

結果

%c{1}

org.apache.com.te.Foo

Foo

%c{2}

org.apache.com.te.Foo

te.Foo

%c{1.}

org.apache.com.te.Foo

o.a.c.t.Foo

%c{1.1.!}

org.apache.com.te.Foo

o.a.!.!.Foo

%c{.}

org.apache.com.te.Foo

….Foo

%C{參數}或%class{參數}

輸出類名。注意,這個是大寫C,上面是小寫c

參數規則與%c完全一樣,請參見上面的說明。

%d{參數}{時區te{參數}{時區

輸出時間。

第一個大括號數可以是保留關鍵字,也可以是text.SimpleDateFormat字符拼接而成。保留關鍵字有:DEFAULT,ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。

第二個大括號中的參數是java.util.TimeZone.getTimeZone的值,可以設定時區。

示例:

pattern表達式

輸出

%d{DEFAULT}

2012-11-02 14:34:02,781

%d{ISO8601}

2012-11-02T14:34:02,781

%d{ISO8601_BASIC}

20121102T143402,781

%d{ABSOLUTE}

14:34:02,781

%d{DATE}

02 Nov 2012

14:34:02,781

%d{COMPACT}

20121102143402781

%d{HH:mm:ss,SSS}

14:34:02,781

%d{dd MMM yyyy HH:mm:ss,SSS}

02 Nov 2012

14:34:02,781

%d{HH:mm:ss}{GMT+0}

18:34:02

%d{UNIX}

1351866842

%d{UNIX_MILLIS}

1351866842781

輸出特殊字符

&, <, >, ”, ’全都要使用實體名稱或實體編號替代,即

符號

實體名稱

實體編號

&

&amp;

&#38;

&lt;

&#60;

&gt;

&#62;

&quot;

&#34;

&apos;

&#39;

官方文檔說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的字符串不受此參數限制。

示例:

輸入

輸出

%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I}

logger.warn輸出W, logger.debug輸出D,其他依次類推

%level{ERROR=FSF, length=2, lowerCase=true}

logger.error會輸出FSF,其他均只輸出前兩個字母,且小寫,如wa/de/in/tr

%level{length=3}

所有都只輸出前3個字符,如WAR/DEB /ERR/TRA/INF

%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個字符



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章