之前寫了篇正在把日誌轉換成Log4j2 現在才正式把項目的日子都換成log4j2,其中有些凌亂,現在把可用的方法過程寫一下:
1、引入log4j2包,把spring-boot-starter-web以及spring-boot-starter兩個包下面的spring-boot-starter-logging排除,然後引入spring-boot-starter-log4j2包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<!-- 使用了log4j2,就要將spring-boot-starter-logging排除 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<!-- 使用了log4j2,就要將spring-boot-starter-logging排除 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 支持log4j2的模塊,注意把spring-boot-starter和spring-boot-starter-web包中的logging去掉 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2、log4j2配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
日誌級別
trace: 是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設置最低日誌級別不讓他輸出。
debug: 調試麼,我一般就只用這個作爲最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就好了麼。
info: 輸出一下你感興趣的或者重要的信息,這個用的最多了。
warn: 有些信息不是錯誤信息,但是也要給程序員的一些提示,類似於eclipse中代碼的驗證不是有error 和warn(不算錯誤但是也請注意,比如以下depressed的方法)。
error: 錯誤信息。用的也比較多。
fatal: 級別比較高了。重大錯誤,這種級別你可以直接停止程序了,是不應該出現的錯誤麼!不用那麼緊張,其實就是一個程度的問題。
-->
<Configuration status="OFF">
<!-- 定義日誌存放目錄 -->
<properties>
<property name="logPath">logs</property>
<!-- 輸出日誌的格式 -->
<!--
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間
%p : 日誌輸出格式
%c : logger的名稱
%m : 日誌內容,即 logger.info("message")
%n : 換行符
%C : Java類名
%L : 日誌輸出所在行數
%M : 日誌輸出所在方法名
hostName : 本地機器名
hostAddress : 本地ip地址 -->
<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} %L %M - %msg%xEx%n</property>
</properties>
<!--先定義所有的appender(輸出器) -->
<Appenders>
<!--輸出到控制檯 -->
<Console name="ConsoleLog" target="SYSTEM_OUT">
<!--只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<!--輸出日誌的格式,引用自定義模板 PATTERN -->
<PatternLayout pattern="${PATTERN}" />
</Console>
<!--輸出到文件 -->
<!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 -->
<!--append爲TRUE表示消息增加到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true -->
<File name="TestLog" fileName="${logPath}/test.log" append="false">
<PatternLayout pattern="${PATTERN}" />
</File>
<!-- 把error等級記錄到文件 一般不用 -->
<File name="FileLog" fileName="${logPath}/error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${PATTERN}" />
</File>
<!--輸出到循環日誌,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔 -->
<RollingFile name="RollingFileLog" fileName="${logPath}/app.log" filePattern="${logPath}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${PATTERN}" />
<SizeBasedTriggeringPolicy size="10MB" />
</RollingFile>
</Appenders>
<!--然後定義logger,只有定義了logger並引入的appender,appender纔會生效 -->
<!--然後定義logger,只有定義了logger並引入的appender,appender纔會生效 -->
<Loggers>
<!--建立一個默認的Root的logger,記錄大於level高於warn的信息,如果這裏的level高於Appenders中的,則Appenders中也是以此等級爲起點,比如,這裏level="fatal",則Appenders中只出現fatal信息 -->
<!-- 生產環境level>=warn -->
<Root level="debug">
<!-- 輸出器,可選上面定義的任何項組合,或全選,做到可隨意定製 -->
<appender-ref ref="ConsoleLog" />
<appender-ref ref="TestLog" />
<appender-ref ref="FileLog" />
<appender-ref ref="RollingFileLog" />
</Root>
<!-- 第三方日誌系統 -->
<!--過濾掉spring和mybatis的一些無用的DEBUG信息,也可以在spring boot 的logging.level.org.springframework=FATAL設置-->
<!-- <logger name="org.springframework" level="INFO"></logger> -->
<!-- <logger name="org.mybatis" level="INFO"></logger> -->
<!-- <logger name="org.apache.http" level="warn" /> -->
</Loggers>
</Configuration>
3、劃重點:application.properties中配置日誌
#要掃描的包記錄日誌信息
logging.config=classpath:log4j2.xml
# 定義記錄某個包內日誌的級別,高於等於則記錄,可以多個
logging.level.org.springframework=FATAL
4、在需要的地方使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static Logger logger = LoggerFactory.getLogger(xx.class);
...
logger.info("------xxxx-------");
或者
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
...
private static Logger logger = LogManager.getLogger(XXX.class);
...
logger.debug(XXX);