Log4j2
log4j2的好處看了以下主要體現(xiàn)在這么幾點(diǎn),提升底層運(yùn)行效率,異步輸出之類的,配置文件支持json等相關(guān)優(yōu)化,對(duì)API進(jìn)行了優(yōu)化,但是API對(duì)外表現(xiàn)的好像看不太出來。
日志級(jí)別
log4j2的日志級(jí)別有很多,但是一般使用error,info,debug最多在加上一個(gè)warn(一般也沒有使用到,另外trace是最低級(jí)別)。
- error:記錄錯(cuò)誤級(jí)別的日志信息,有異常發(fā)生之類的。
- warn:記錄警告級(jí)別的信息。
- info:記錄常用的日志信息,一般記錄一些開始,結(jié)束和相關(guān)的關(guān)鍵字段。
- debug:記錄debug級(jí)別的調(diào)試信息。
依賴
log4j2需要導(dǎo)入兩個(gè)jar包,分別為
log4j-core-xx.jar
log4j-api-xx.jar
如果使用maven導(dǎo)入相關(guān)jar,可以參考下面的pom文件。
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.qingtianr</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--<dependency>-->
<!--<groupId>log4j</groupId>-->
<!--<artifactId>log4j</artifactId>-->
<!--<version>1.2.14</version>-->
<!--</dependency>-->
<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>
</project>
Example
log4j2Test.java
package cn.qingtianr;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j2Test {
//使用LogManager來獲得Logger(和log4j不一樣了)
private static Logger logger = LogManager.getLogger(log4j2Test.class);
public static void main(String[] args) {
logger.error("我是error信息");
logger.warn("我是warn信息");
logger.info("我是info信息");
logger.debug("我是debug信息");
}
}
配置文件
在classpath目錄下面需要有一個(gè)配置文件。
在默認(rèn)情況下,系統(tǒng)選擇configuration文件的優(yōu)先級(jí)如下:(classpath為scr文件夾)
- classpath下名為 log4j-test.json 或者log4j-test.jsn文件
- classpath下名為 log4j2-test.xml
- classpath下名為 log4j.json 或者log4j.jsn文件
- classpath下名為 log4j2.xml
如果是用maven管理的話,那么可以直接放在resouces里面就可以了。其實(shí)可以發(fā)現(xiàn)log4j2是不在支持properties,但是都是支持xml來配置的。
下面這個(gè)可以認(rèn)為是沒有配置文件時(shí)的時(shí)候的默認(rèn)配置。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
所以在默認(rèn)的配置下面可以在控制臺(tái)中看到以下輸出信息。因?yàn)槟J(rèn)是error級(jí)別的信息,所以只會(huì)有error級(jí)別的信息。
14:35:54.002 [main] ERROR cn.qingtianr.log4j2Test - 我是error信息
如果把<root level="error">中的error改為info,那么將會(huì)輸出以下日志信息。也就是說會(huì)輸出所有info級(jí)別及以上級(jí)別的日志信息。
14:38:01.086 [main] ERROR cn.qingtianr.log4j2Test - 我是error信息
14:38:01.088 [main] WARN cn.qingtianr.log4j2Test - 我是warn信息
14:38:01.088 [main] INFO cn.qingtianr.log4j2Test - 我是info信息
Appenders
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定義所有的appender-->
<appenders>
<!--這個(gè)輸出控制臺(tái)的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--這個(gè)都知道是輸出日志的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件會(huì)打印出所有信息,這個(gè)log每次運(yùn)行程序會(huì)自動(dòng)清空,由append屬性決定,這個(gè)也挺有用的,適合臨時(shí)測(cè)試用-->
<File name="log" fileName="log/test.log" append="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--這個(gè)會(huì)打印出所有的信息,每次大小超過size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔-->
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</RollingFile>
</appenders>
<!--然后定義logger,只有定義了logger并引入的appender,appender才會(huì)生效-->
<loggers>
<!--建立一個(gè)默認(rèn)的root的logger-->
<root level="info">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
把這個(gè)配置文件和之前簡(jiǎn)單的配置文件進(jìn)行比較可以知道appender的使用方式,主要的appender有下面幾種。
- ConsoleAppender:用來輸出到控制臺(tái)
- FileAppender:用來輸出到文件中
- RollingFileAppender:用來將到一定大小的文件按時(shí)間進(jìn)行存檔
Layout
可以將傳入的日志信息已一定格式進(jìn)行輸出,有HTML格式的,CVS格式的等,最主要使用的應(yīng)該就是PatternLayout,有點(diǎn)類似于格式化輸出的情況。
例子項(xiàng)目截圖

其中有自己log4j的東西,省略.....
Other
具體的配置文件中的東西,可以參考官方文檔。
一些其他問題
- Log4j(或者Log4j2)和Spring是如何關(guān)聯(lián)起來的,可以弄個(gè)詳細(xì)的東西來簡(jiǎn)單描述一下。Spring的core包使用的日志工具會(huì)自動(dòng)找尋classpath下面的jar包,如果發(fā)現(xiàn)有Log4j或者Log4j2的jar包,會(huì)直接導(dǎo)入進(jìn)去的。
- 但是如果沒有使用Spring的話,是需要手動(dòng)在web.xml中使用一個(gè)監(jiān)聽器來將Log4j(或者Log4j2)的配置文件給讀入進(jìn)去的。
- 利用Log4j是可以將Mybatis里面最終執(zhí)行的數(shù)據(jù)庫的sql語句給紀(jì)錄下來的,所以下次可以做一個(gè)簡(jiǎn)單的demo出來。
參考
log4j2的API
log4j2的提升點(diǎn)
Log4j的isdebugEnabled的作用
Log4j 2使用教程