背景
log4j2相對於log4j 1.x有了脫胎換骨的變化,其官網宣稱的優勢有多線程下10幾倍於log4j 1.x和logback的高吞吐量、可配置的審計型日志、基於插件架構的各種靈活配置等。
1、所需jar
1)maven配置
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
網頁的話還要加入如下的maven配置:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<scope>runtime</scope>
</dependency>
2)使用jar
log4j-api-2.7.jar log4j-core-2.7.jar
2、配置日志打印文件
java項目尋找log4j2配置文件會依次讀取classpath是否有下面這些文件:
我們在main/src/resource目錄下添加log4j2.xml文件。文件內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<!-- 變量配置 -->
<Properties>
<Property name="log_path">${sys:catalina.home}/logs/zcrTest/</Property>
</Properties>
<!-- appender配置 -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
</Console>
<RollingFile name="DailyRollingFile" fileName="${log_path}/zcrTest.log"
filePattern="${log_path}/zcrTest%d{yyyy-MM-dd}.log">
<PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10 MB" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="mylog" level="trace" additivity="false">
<AppenderRef ref="DailyRollingFile" />
</Logger>
<!-- 配置要使用的appender -->
<!--
additivity開啟的話,由於這個logger也是滿足root的,所以會被打印兩遍。
不過root logger 的level是error,為什麼Bar 裡面的trace信息也被打印兩遍呢
-->
<Root level="info"> <AppenderRef ref="Console" /> <AppenderRef ref="DailyRollingFile"/> </Root> </Loggers> </Configuration>
上面的log4j2.xml中以Configuration為根節點,有一個status屬性,這個屬性表示log4j2本身的日志信息打印級別。如果把status改為TRACE再執行測試代碼,可以看到控制台中打印了一些log4j加載插件、組裝logger等調試信息。
日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低於WARN的信息都不會輸出。對於Loggers中level的定義同樣適用。
上面配置了兩種日志打印的方式,打印的等級是info。
Rolling的意思是當滿足一定條件後,就重命名原日志文件用於備份,並從新生成一個新的日志文件。例如需求是每天生成一個日志文件,但是如果一天內的日志文件體積已經超過1G,就從新生成,兩個條件滿足一個即可。這在log4j 1.x原生功能中無法實現,在log4j2中就很簡單了。
RollingRandomAccessFile的屬性:
TimeBasedTriggeringPolicy 這個配置需要和filePattern結合使用,注意filePattern中配置的文件重命名規則是${log_path}/zcrTest%d{yyyy-MM-dd}.log,最小的時間粒度是dd,即分鐘,TimeBasedTriggeringPolicy指定的size是1,結合起來就是每一天生成一個新文件。如果改成%d{yyyy-MM-dd HH},最小粒度為小時,則每一個小時生成一個文件。
3、調用
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; private static Logger logger = LogManager.getLogger(APIV1Filter.class);
logger.info(..);
logger.error(..)
4、如果是web項目還要加入如下的配置
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>"log4j2.xml所在目錄"/log4j2.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
致謝,感謝您的閱讀!