log4j2配置詳解(節點和輸出格式)
本文章主要詳細介紹log4j2的配置!!
1.配置檔案節點解析
(1).根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).status用來指定log4j本身的列印日誌的級別.
monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.
(2).Appenders節點,常見的有三種子節點:Console、RollingFile、File.
Console節點用來定義輸出到控制檯的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置預設:SYSTEM_OUT.
PatternLayout:輸出格式,不設定預設為:%m%n.
File節點用來定義輸出到指定位置的檔案的Appender.
name:指定Appender的名字.
fileName:指定輸出日誌的目的檔案帶全路徑的檔名.
PatternLayout:輸出格式,不設定預設為:%m%n.
RollingFile節點用來定義超過指定大小自動刪除舊的建立新的的Appender.
name:指定Appender的名字.
fileName:指定輸出日誌的目的檔案帶全路徑的檔名.
PatternLayout:輸出格式,不設定預設為:%m%n.
filePattern:指定新建日誌檔案的名稱格式.
Policies:指定滾動日誌的策略,就是什麼時候進行新建日誌檔案輸出日誌.
TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,預設是1 hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那麼第一次滾動是在4am,接著是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子節點,基於指定檔案大小的滾動策略,size屬性用來定義每個日誌檔案的大小.
DefaultRolloverStrategy:用來指定同一個資料夾下最多有幾個日誌檔案時開始刪除最舊的,建立新的(通過max屬性),預設是7個檔案。
(3).Loggers節點,常見的有兩種:Root和Logger.
Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼就會預設使用該Root日誌輸出
level:日誌輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節點,用來指定該日誌輸出到哪個Appender.
Logger節點用來單獨指定日誌的形式,比如要為指定包下的class指定不同的日誌級別等。
level:日誌輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
AppenderRef:Logger的子節點,用來指定該日誌輸出到哪個Appender,如果沒有指定,就會預設繼承自Root.如果指定了,那麼會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設定Logger的additivity="false"只在自定義的Appender中進行輸出。
(4).關於日誌level.
共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
All:最低等級的,用於開啟所有日誌記錄.
Trace:是追蹤,就是程式推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設定最低日誌級別不讓他輸出.
Debug:指出細粒度資訊事件對除錯應用程式是非常有幫助的.
Info:訊息在粗粒度級別上突出強調應用程式的執行過程.
Warn:輸出警告及warn以下級別的日誌.
Error:輸出錯誤資訊日誌.
Fatal:輸出每個嚴重的錯誤事件將會導致應用程式的退出的日誌.
OFF:最高等級的,用於關閉所有日誌記錄.
2.輸出格式詳解:
%c | 列出logger名字空間的全稱,如果加上{<層數>}表示列出從最內層算起的指定層數的名字空間 | log4j配置檔案引數舉例 | 輸出顯示媒介 |
假設當前logger名字空間是"a.b.c" | |||
%c | a.b.c | ||
%c{2} | b.c | ||
%20c | (若名字空間長度小於20,則左邊用空格填充) | ||
%-20c | (若名字空間長度小於20,則右邊用空格填充) | ||
%.30c | (若名字空間長度超過30,截去多餘字元) | ||
%20.30c | (若名字空間長度小於20,則左邊用空格填充;若名字空間長度超過30,截去多餘字元) | ||
%-20.30c | (若名字空間長度小於20,則右邊用空格填充;若名字空間長度超過30,截去多餘字元) | ||
%C | 列出呼叫logger的類的全名(包含包路徑) | 假設當前類是"org.apache.xyz.SomeClass" | |
%C | org.apache.xyz.SomeClass | ||
%C{1} | SomeClass | ||
%d | 顯示日誌記錄時間,{<日期格式>}使用ISO8601定義的日期格式 | %d{yyyy/MM/dd HH:mm:ss,SSS} | 2005/10/12 22:23:30,117 |
%d{ABSOLUTE} | 22:23:30,117 | ||
%d{DATE} | 12 Oct 2005 22:23:30,117 | ||
%d{ISO8601} | 2005-10-12 22:23:30,117 | ||
%F | 顯示呼叫logger的原始檔名 | %F | MyClass.java |
%l | 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數 | %l | MyClass.main(MyClass.java:129) |
%L | 顯示呼叫logger的程式碼行 | %L | 129 |
%m | 顯示輸出訊息 | %m | This is a message for debug. |
%M | 顯示呼叫logger的方法名 | %M | main |
%n | 當前平臺下的換行符 | %n | Windows平臺下表示rn UNIX平臺下表示n |
%p | 顯示該條日誌的優先順序 | %p | INFO |
%r | 顯示從程式啟動時到記錄該條日誌時已經經過的毫秒數 | %r | 1215 |
%t | 輸出產生該日誌事件的執行緒名 | %t | MyClass |
%x | 按NDC(Nested Diagnostic Context,執行緒堆疊)順序輸出日誌 | 假設某程式呼叫順序是MyApp呼叫com.foo.Bar | |
%c %x - %m%n | MyApp - Call com.foo.Bar. com.foo.Bar - Log in Bar MyApp - Return to MyApp. |
||
%X | 按MDC(Mapped Diagnostic Context,執行緒對映表)輸出日誌。通常用於多個客戶端連線同一臺伺服器,方便伺服器區分是那個客戶端訪問留下來的日誌。 | %X{5} | (記錄代號為5的客戶端的日誌) |
%% | 顯示一個百分號 | %% | % |
一個比較全的模版:
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration後面的status,這個用於設定log4j2自身內部的資訊輸出,可以不設定-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->
<configuration status="WARN" monitorInterval="30">
<!--先定義所有的appender-->
<appenders>
<!--輸出到控制檯-->
<console name="Console" target="SYSTEM_OUT">
<!--輸出日誌的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--列印到檔案中,這個log每次執行程式會自動清空,由append屬性決定-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--檔案滾動, 這個會打印出所有的info及以下級別的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔-->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<DefaultRolloverStrategy max="20"/> <!--資料夾下最多的檔案個數-->
<TimeBasedTriggeringPolicy interval="2 hour"/> <!--多長時間滾動一次-->
<SizeBasedTriggeringPolicy size="100 MB"/> <!-- 一個日誌檔案的最大大小 -->
</Policies>
</RollingFile>
</appenders>
<!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG資訊-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
參考文章:
http://www.cnblogs.com/hafiz/p/6170702.html
http://blog.csdn.net/u012729481/article/details/21094003