Log4j2的基本使用


  Log4j2是Log4j1.x的的升級版,其中也有很大的不同,最大的區別就是由以前的properties配置文件改為xml/json/yaml配置文件。

  其中配置文件的位置官方說明如下:

  1. 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.
  2. If no system property is set the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
  3. If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
  4. If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
  5. If a test file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
  6. If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
  7. If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
  8. 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的過濾,不然高於配置級別的日志都會被輸入到該文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM