Log4j2是Log4j1.x的的升級版,其中也有很大的不同,最大的區別就是由以前的properties配置文件改為xml/json/yaml配置文件。
其中配置文件的位置官方說明如下:
- Log4j will inspect the "log4j.configurationFile" system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.
- If no system property is set the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
- If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
- If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
- If a test file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
- If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
- If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
- If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.
它會依次查找可能存在的配置文件,也可自定義配置文件的路徑。可設置System.setProperty("log4j.configurationFile", path);來自定義配置文件的路徑。注意:默認配置文件會查找以log4j2命名的文件。
配置文件以<Configuration></Configuration>為根節點。可設置其默認的日志輸出級別status,可輸入的值可為 "trace", "debug", "info", "warn", "error" and "fatal"。也可以設置其自動循環執行配置文件的時間monitorInterval,默認是5s。
log4j2的配置文件會有幾個必須的節點,Appenders和Root。Appenders配置是其輸出的日志形式,有log文件輸出/控制台輸出/數據庫寫入/消息發送等方式。以控制台輸出為例,其配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="WARN"> 3 <Appenders> 4 <Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 5 </Console> 6 </Appenders> 7 <Loggers> 8 <Root level="error"> 9 <AppenderRef ref="Console"/> 10 </Root> 11 </Loggers> 12 </Configuration>
Appender
其中Appender有很多種方法,常用的例如異步AsyncAppender、控制台ConsleAppender、救援FailoverAppender、文件FileAppender、數據庫JDBCAppender、滾動文件RollingFileAppender等。
異步AsyncAppender不是單獨配置的,而是引用其他已配置的Appender。它多用於不同線程操作日志的情況。配置格式如下:
1 <File name="MyFile" fileName="logs/app.log"> 2 <PatternLayout> 3 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 4 </PatternLayout> 5 </File> 6 <Async name="Async"> 7 <AppenderRef ref="MyFile"/> 8 </Async>
救援FailoverAppender是包裹其他的appender使用的。它的用處是當第一個Appender失效的時候,就執行第二個Appender,以此類推直到沒有Appender可執行了。配置如下:
1 <Appenders> 2 <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz" 3 ignoreExceptions="false"> 4 <PatternLayout> 5 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 6 </PatternLayout> 7 <TimeBasedTriggeringPolicy /> 8 </RollingFile> 9 <Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false"> 10 <PatternLayout pattern="%m%n"/> 11 </Console> 12 <Failover name="Failover" primary="RollingFile"> 13 <Failovers> 14 <AppenderRef ref="Console"/> 15 </Failovers> 16 </Failover> 17 </Appenders>
文件FileAppender是一種輸出流的方式輸出日志文件的。格式如下:
1 <Appenders> 2 <File name="MyFile" fileName="logs/app.log"> 3 <PatternLayout> 4 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 5 </PatternLayout> 6 </File> 7 </Appenders>
數據庫JDBCAppender是把錯誤日志信息根據配置存儲到數據庫中,兩種格式如下:
1 <Appenders> 2 <JDBC name="databaseAppender" tableName="dbo.application_log"> 3 <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" /> 4 <Column name="eventDate" isEventTimestamp="true" /> 5 <Column name="level" pattern="%level" /> 6 <Column name="logger" pattern="%logger" /> 7 <Column name="message" pattern="%message" /> 8 <Column name="exception" pattern="%ex{full}" /> 9 </JDBC> 10 </Appenders>
1 <Appenders> 2 <JDBC name="databaseAppender" tableName="LOGGING.APPLICATION_LOG"> 3 <ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" /> 4 <Column name="EVENT_ID" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" /> 5 <Column name="EVENT_DATE" isEventTimestamp="true" /> 6 <Column name="LEVEL" pattern="%level" /> 7 <Column name="LOGGER" pattern="%logger" /> 8 <Column name="MESSAGE" pattern="%message" /> 9 <Column name="THROWABLE" pattern="%ex{full}" /> 10 </JDBC> 11 </Appenders>
第二種方法配置了Connection工廠類以及獲取Connection的方法。該Connection是JDBC連接數據庫的java.sql.Connection。
滾動文件RollingFileAppender是根據配置生成多文件的方法。它提供了一些文件的觸發方法和生成格式。示例如下:
1 <Appenders> 2 <RollingFile name="RollingFile" fileName="logs/app.log" 3 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> 4 <PatternLayout> 5 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 6 </PatternLayout> 7 <Policies> 8 <TimeBasedTriggeringPolicy /> 9 <SizeBasedTriggeringPolicy size="250 MB"/> 10 </Policies> 11 </RollingFile> 12 </Appenders>
其中fileName是默認當前日志的名稱。filePattern是多日志生成的命名規則。它依賴於日志的生成規則。可根據SimpleDateFormat的格式化日期或者%i整型計數等方式命名文件名。觸發規則Policies有三種方式:
1 <Policies> 2 <OnStartupTriggeringPolicy /> 3 <SizeBasedTriggeringPolicy size="20 MB" /> 4 <TimeBasedTriggeringPolicy /> 5 </Policies>
OnStartup規則沒有參數,如果當前日志文件比JVM的時間要遲,就會觸發,生成新的日志。
SizeBased有一個參數size,即文件日志大小。當日志文件到達這個大小的時候,就會生成新的日志文件。后綴可為KB、MB、GB。
TimeBased是基於時間觸發的周期性的保存日志,它有兩個參數,interval:觸發時間,單位為日志filePattern時間命名的的精度單位,默認是1。modulate:布爾類型。說明是否對日志生成時間進行調制。若為true,則日志時間將以0點為邊界進行偏移計算。例如第一次日志保存時間是3點,modulate為true,interval是4h。那么下次生成日志時間是4點,08:00,12:00……
默認的文件生成規則DefaultRolloverStrategy。它有4個參數:
fileIndex:文件索引。
min:文件最小數量,默認是1;
max:文件最大數量。一旦達到這個最大數,以前的文檔就會在下一輪生成日志的時候刪除。
compressionLevel: 日志壓縮級別。0-9,壓縮效果依次增大。只對於壓縮文件類型有效。<DefaultRolloverStrategy max="20"/>
文件的壓縮格式支持的后綴名:".gz",".zip",".bz2",".xz"
Layout
layout是日志文件的布局格式。支持的格式比較多,有CSV/JSON/HTML/RFC-5424/pattern/XML等等,用法大同小異。以常用的pattern、HTML為例:
pattern是最常用也是比較簡單的方式生成日志格式。它可以使用\t,\n,\r,\f用來分割排列信息。使用%加一些特定的英文單詞輸出日志詳細描述。
比較常用的有:
%c: Logger的名稱。它可以接受一個整型的參數。規則如下:
Conversion Pattern | Logger Name | Result |
---|---|---|
%c{1} | org.apache.commons.Foo | Foo |
%c{2} | org.apache.commons.Foo | commons.Foo |
%c{1.} | org.apache.commons.Foo | o.a.c.Foo |
%c{1.1.~.~} | org.apache.commons.test.Foo | o.a.~.~.Foo |
%c{.} | org.apache.commons.test.Foo | ....Foo |
%d:日志事件的時間。參考示例如下:
Pattern | Example |
---|---|
%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 |
ex|exception|throwable
{["none"
|"full"
|depth
|"short"
|"short.className"
|"short.fileName"
|"short.lineNumber"
|"short.methodName"
|"short.message"
|"short.localizedMessage"]}:輸出一個異常日志,后面可以帶指定的字符串。默認輸出信息是Throwable.printStackTrace()。
%m/%msg/%message:輸出日志事件所提供的信息。
%n:日志換行。
%level:日志級別。
%t:當前生成日志事件的線程。
HTMLLayout是將日志文件生成一個HTML文件,它的好處是可以通過瀏覽器瀏覽。它是以table生成日志信息的。
可接收4個配置參數:
charset:文檔類型,默認是utf-8。
contentType:用於申明文件頭。默認是“text/html”。
locationInfo:布爾類型。如果為true的話。文件名和行數會寫入到html中。默認是false。
title: html文件的標題。
Filter
配置日志的filter可以控制輸出日志的類型。以ThresholdFilter為例,它是過濾日志級別的過濾器,允許通過的日志輸出,不允許的不輸出。它有三個參數:
level:配對的級別,即該級別的名稱。
onMatch: 符合條件的級別。可填寫: ACCEPT, DENY or NEUTRAL. 默認是NEUTRAL。
onMisMatch:不符合的級別。可填寫: ACCEPT, DENY or NEUTRAL. 默認是DENY。
示例:
1 <Appenders> 2 <RollingFile name="RollingFile" fileName="logs/app.log" 3 filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> 4 <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/> 5 <PatternLayout> 6 <pattern>%d %p %c{1.} [%t] %m%n</pattern> 7 </PatternLayout> 8 <TimeBasedTriggeringPolicy /> 9 </RollingFile> 10 </Appenders>
這樣配置之后,該log日志文件只會輸出比trace更高級別或者同等級別的日志了。
最后說下配置需要注意的事項:
1.每個配置都需要一個root節點,root節點可以配置日志的級別,所有的Appender要配置到root中才能生效。
2.可以配置獨立的Logger,設置其level以及additivity,addivity是布爾值,代表是否遵從log4j2的日志輸出級別。
3.log4j2的日志級別:ALL<DEBUG<INFO<WARN<ERROR<FATAL。 日志輸出遵從這樣的級別,假設當前設置的日志輸出級別是WARN,那么高於或者等於WARN級別的日志都會被輸出,所以如果想把特定類型的日志寫入到單獨的日志文件中,需要做一個filter的過濾,不然高於配置級別的日志都會被輸入到該文件中。