log4j2和log4j是一個作者,只不過log4j2是重新架構的一款日志組件罗岖,他拋棄了之前l(fā)og4j的不足谍珊,以及吸取了優(yōu)秀的logback的設計重新推出的一款新組件搀别。
- 在pom.xml中導入依賴,首先去除SpringBoot自帶的logging包(logback),再導入log4j2的依賴包,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 想要配置log4j2,就要先去除logging包 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引用log4j2依賴包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
- 若是你只是想看看日志,這時在application配置文件中配置,
#application.properties
logging.level.root=error #顯示日志級別
#application.yml
logging:
level:
root: info #顯示日志級別
log4j2 中默認的日志級別為:trace < debug < info < warn < error < fatal
當設置了日志輸出級別時怕享,當前級別及以上級別的日志會輸出执赡,而當前級別以下級別的日志則不會輸出,系統(tǒng)默認輸出級別為 error函筋,也就是說默認設置下沙合,只有 error 和 fatal這兩級日志會輸出.
trace:即追蹤,程序每推進一步均可輸出一條trace日志跌帐,主要用于展現(xiàn)程序運行軌跡
debug:調(diào)試
info:輸出你感興趣的信息首懈,一般用于基本的、高層次的診斷信息谨敛。在長時間運行的代碼段開始運行及結束運行時應該產(chǎn)生消息究履,以便知道現(xiàn)在系統(tǒng)在干什么。但是這樣的信息不宜太過頻繁
warn:提示信息
error:錯誤信息脸狸,顯示一個錯誤最仑,或一個通用的錯誤情況,但還不至于會將系統(tǒng)掛起炊甲。這種程度的錯誤一般會觸發(fā)郵件的發(fā)送泥彤,將消息發(fā)送到alert list中,運維人員可以在文檔中記錄這個bug并提交
fatal:會導致程序崩潰的重大錯誤蜜葱,用在極端的情形中全景,即必須馬上獲得注意的情況
這時候,就可以使用系統(tǒng)默認的輸出格式了,如圖所示:
但是很多的時候我們需要進行日志的記錄以及后期維護時日志的查看,所以我們需要自定義日志的配置,配置文件命名的規(guī)則如下:
-
文件配置優(yōu)先級
對應于四類配置文件:XML耀石、 JSON牵囤、 YAML 和 properties,Log4j 分別有與之相應的 ConfigurationFactory 實現(xiàn)類滞伟,不同的實現(xiàn)類可以加載不同擴展名的配置文件中的配置信息揭鳞。當 Log4j 啟動時會按照一定的優(yōu)先級順序在classpath(一般是項目的src文件夾下,即在src/main/resources下)查找項目中的配置文件,若找到一個配置文件梆奈,就調(diào)用與當前文件擴展名對應的ConfigurationFactory實現(xiàn)類加載該配置文件中的配置信息野崇,否則繼續(xù)查找下一優(yōu)先級的配置文件,若未找到任何配置文件亩钟,就使用默認配置DefaultConfiguration乓梨。
不同配置文件的優(yōu)先級如下圖所示:
配置文件內(nèi)容:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- status : 這個用于設置log4j2自身內(nèi)部的信息輸出,默認是OFF,可以不設置,當設置成trace時,會看到log4j2內(nèi)部各種詳細輸出
monitorInterval : Log4j能夠自動檢測修改配置文件和重新配置本身, 設置間隔秒數(shù)。
注:本配置文件的目標是將不同級別的日志輸出到不同文件清酥,最大2MB一個文件扶镀, 文件數(shù)據(jù)達到最大值時,舊數(shù)據(jù)會被壓縮并放進指定文件夾 -->
<Configuration status="TRACE" monitorInterval="600">
<Properties> <!-- 配置全局變量 -->
<!-- 配置日志文件輸出目錄焰轻,此配置將日志輸出到tomcat根目錄下的指定文件夾 -->
<!-- <Property name="LOG_HOME">D:/logs</Property> -->
<Property name="LOG_HOME">./target/logs</Property>
<!-- 配置日志輸出格式 -->
<Property name="LOG_PATTERN">%d{yyyy-MM-dd 'at' HH:mm:ss.SSS} %-5level [%t] (%F:%M:%L) --- %m%xEx%n</Property>
<!-- 配置日志輸出級別 --><!-- 設置顯示級別直接在這里修改 -->
<Property name="OUT_LOG_LEVEL">INFO</Property>
<!-- 配置日志切割的最小單位 -->
<Property name="FILE_SIZE">2MB</Property>
</Properties>
<Appenders>
<!-- 優(yōu)先級從高到低分別是 OFF臭觉、FATAL、ERROR、WARN蝠筑、INFO狞膘、DEBUG、TRACE -->
<!-- 單詞解釋:
Match:匹配
DENY:拒絕
Mismatch:不匹配
ACCEPT:接受 -->
<!--
DENY什乙,日志將立即被拋棄不再經(jīng)過其他過濾器挽封;
NEUTRAL,有序列表里的下個過濾器過接著處理日志臣镣;
ACCEPT场仲,日志會被立即處理,不再經(jīng)過剩余過濾器退疫。 -->
<!--輸出日志的格式
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生產(chǎn)時間,輸出到毫秒的時間
%-5level : 輸出日志級別渠缕,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0
%p : 日志輸出格式,輸出日志級別褒繁,-5表示左對齊并且固定輸出5個字符亦鳞,如果不足在右邊補0
%c : logger的名稱 (%logger)
%t : 輸出當前線程名稱
%m : 日志內(nèi)容,即 logger.info("message")
%n : 換行符
%C : Java類名(%F)
%L : 日志輸出所在行數(shù)
%M : 日志輸出所在方法名
%l : 輸出語句所在的行數(shù), 包括類名棒坏、方法名燕差、文件名、行數(shù)
hostName : 本地機器名
hostAddress : 本地ip地址 -->
<!--這個輸出控制臺的配置坝冕,這里輸出除了debug到error級別的信息到System.out -->
<Console name="console_out_appender" target="SYSTEM_OUT">
<!-- 控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) . -->
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="NEUTRAL" />
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="NEUTRAL" />
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
<!-- 輸出日志的格式 -->
<PatternLayout pattern="${LOG_PATTERN}" />
<!-- <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> -->
</Console>
<!-- 這個輸出控制臺的配置徒探,這里輸出error級別以上的信息到System.err,在eclipse控制臺上看到的是紅色文字 -->
<Console name="console_err_appender" target="SYSTEM_ERR">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${LOG_PATTERN}" />
</Console>
<!-- 運行時的測試日志 -->
<!-- 文件會打印出所有信息喂窟,這個log每次運行程序會自動清空测暗,由append屬性決定,這個也挺有用的磨澡,適合臨時測試用 -->
<!-- append為TRUE表示消息增加到指定文件中碗啄,false表示消息覆蓋指定的文件內(nèi)容,默認值是true -->
<File name="INFO" fileName="${LOG_HOME}/testLog.log" append="false">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!--
循環(huán)日志文件:日志文件大于閥值的時候稳摄,就開始寫一個新的日志文件這個會打印出所有的信息稚字,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮厦酬,作為存檔
fileName : 指定當前日志文件的位置和文件名稱
filePattern : 指定當發(fā)生Rolling時胆描,文件的轉(zhuǎn)移和重命名規(guī)則
SizeBasedTriggeringPolicy : 指定當文件體積大于size指定的值時,觸發(fā)Rolling
DefaultRolloverStrategy : 指定最多保存的文件個數(shù)
TimeBasedTriggeringPolicy : 這個配置需要和filePattern結合使用
注意:filePattern中配置的文件重命名規(guī)則是${FILE_NAME}_%d{yyyy-MM-dd}_%i仗阅,最小的時間粒度是dd昌讲,即天,TimeBasedTriggeringPolicy指定的size是1霹菊,結合起來就是每1天生成一個新文件
-->
<!-- TRACE級別日志 ; 設置日志格式并配置日志壓縮格式剧蚣,壓縮文件獨立放在一個文件夾內(nèi)支竹, 日期格式不能為冒號,否則無法生成鸠按,因為文件名不允許有冒號礼搁,此appender只輸出trace級別的數(shù)據(jù)到trace.log -->
<RollingFile name="trace_appender" immediateFlush="true" fileName="${LOG_HOME}/trace.log" filePattern="${LOG_HOME}/trace/trace - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<!-- 每個日志文件最大2MB -->
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<!-- 設置同一類型日志文件個數(shù),默認為7 -->
<!-- <DefaultRolloverStrategy max="20"/> -->
<Filters>
<!-- 此Filter意思是,只輸出TRACE級別的數(shù)據(jù) DENY目尖,日志將立即被拋棄不再經(jīng)過其他過濾器馒吴; NEUTRAL,有序列表里的下個過濾器過接著處理日志瑟曲; ACCEPT饮戳,日志會被立即處理,不再經(jīng)過剩余過濾器洞拨。 -->
<ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</RollingFile>
<!-- DEBUG級別日志 設置日志格式并配置日志壓縮格式扯罐,壓縮文件獨立放在一個文件夾內(nèi), 日期格式不能為冒號烦衣,否則無法生成歹河,因為文件名不允許有冒號,此appender只輸出debug級別的數(shù)據(jù)到debug.log; -->
<RollingFile name="debug_appender" immediateFlush="true" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug/debug - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<!-- 每個日志文件最大2MB ; -->
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" /><!-- 按大小分 -->
<!-- 如果啟用此配置花吟,則日志會按文件名生成新壓縮文件秸歧, 即如果filePattern配置的日期格式為 %d{yyyy-MM-dd HH} ,則每小時生成一個壓縮文件衅澈, 如果filePattern配置的日期格式為 %d{yyyy-MM-dd} 键菱,則天生成一個壓縮文件 -->
<!-- <TimeBasedTriggeringPolicy interval="1" modulate="true" /> --><!-- 按天分日志文件 -->
</Policies>
<Filters><!-- 此Filter意思是,只輸出debug級別的數(shù)據(jù) -->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</RollingFile>
<!-- INFO級別日志 -->
<RollingFile name="info_appender" immediateFlush="true" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/info/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</RollingFile>
<!-- WARN級別日志 -->
<RollingFile name="warn_appender" immediateFlush="true" fileName="${LOG_HOME}/warn.log" filePattern="${LOG_HOME}/warn/warn - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</RollingFile>
<!-- ERROR級別日志 -->
<RollingFile name="error_appender" immediateFlush="true" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error/error - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</RollingFile>
</Appenders>
<!-- 然后定義logger今布,只有定義了logger并引入的appender经备,appender才會生效 -->
<Loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
<logger name="org.springframework" level="INFO" />
<logger name="org.mybatis" level="INFO" />
<!-- 配置日志的根節(jié)點 -->
<!-- 定義logger,只有定義了logger并引入了appender险耀,appender才會生效 -->
<root level="${OUT_LOG_LEVEL}">
<appender-ref ref="console_out_appender" />
<appender-ref ref="console_err_appender" />
<appender-ref ref="trace_appender" />
<appender-ref ref="debug_appender" />
<appender-ref ref="info_appender" />
<appender-ref ref="warn_appender" />
<appender-ref ref="error_appender" />
</root>
</Loggers>
</Configuration>
到這里就可以使用log4j2日志了,其顯示如下圖:
- 但是我這種強迫一定要分包分類存放文件,如下:
這時你會發(fā)現(xiàn)啟動項目會報錯,無法找到log4j2的配置文件,解決辦法:
- 在application配置文件中添加log日志配置文件地址
# yml方式
logging:
config: classpath:log4j2/log4j2-spring.xml
# properties方式
logging.config = classpath:log4j2/log4j2-spring.xml
再啟動項目就可以成功了.
- 使用方式
# 導包
import org.apache.logging.log4j.LogManager;
# 初始化log
private static final Logger log = LogManager.getLogger(SysDepartmentController.class);
# 使用
log.trace("======trace");
log.debug("======debug");
log.info("======info");
log.warn("======warn");
log.error("======error");
log4j2的官網(wǎng):http://logging.apache.org/log4j/2.x/
Log4j2高級配置以及簡單的示例:https://my.oschina.net/kkrgwbj/blog/734530
Log4j2配置項目詳解:https://blog.csdn.net/womeng2009/article/details/53510913
Log4j2詳解:http://www.reibang.com/p/4ac14b9f51d2
SpringBoot官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/html/index.html
Log4j2日志輸出路徑配置:https://www.cnblogs.com/doit8791/p/5372004.html