背景
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>
致謝,感謝您的閱讀!