一文帶你搞定SpringBoot Log4j2日志配置文件
1.在 Spring Boot 應(yīng)用中集成 Log4j2
首先在項(xiàng)目pom文件中引入Log4j的依賴
<!--log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
在當(dāng)前項(xiàng)目的resource目錄下增加文件 log4j2.xml

下面介紹配置文件中各個(gè)節(jié)點(diǎn),感興趣的小伙伴也可以去官網(wǎng)查看
2.配置節(jié)點(diǎn)
2.1 根節(jié)點(diǎn)configuration
有兩個(gè)屬性:status,monitorinterval,兩個(gè)子節(jié)點(diǎn):Appenders和Loggers表名可以定義多個(gè)Appender和Logger
- status,用來(lái)指定log4j本身的打印日志級(jí)別 OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
- monitorinterval 重新讀取配置文件的監(jiān)測(cè)間隔時(shí)間,單位是s,最小是5s.
2.2 Properties
屬性(可選),用來(lái)定義常量(例如日志打印的模版),之后在其他配置項(xiàng)中通過(guò)${變量名}引用
2.3 Appenders
常見(jiàn)的有三種子節(jié)點(diǎn):Console、RollingFile、File
2.3.1 Console
用來(lái)定義輸出到控制臺(tái)的Appender兩個(gè)屬性:name、target,一個(gè)節(jié)點(diǎn):PatternLayout
- name(屬性):指定Appender的名字
- target(屬性):SYSTEM_OUT 或 SYSTEM_ERR,一般只設(shè)置默認(rèn):SYSTEM_OUT.
- PatternLayout(節(jié)點(diǎn)):指定輸出日志的格式,可以使用pattern屬性與Properties中定義的日志打印模板常量相結(jié)合,控制日志輸出的模版,不設(shè)置則默認(rèn)為:%m%n
2.3.2 File
文件輸出源,用于將日志寫入到指定的文件,需要配置輸入到哪個(gè)位置(例如:D:/logs/info.log)
- name(屬性)::指定Appender的名字.
- fileName(屬性):指定輸出日志的目的文件帶全路徑的文件名.
- PatternLayout(節(jié)點(diǎn)):輸出格式,不設(shè)置默認(rèn)為:%m%n.
2.3.3 RollingFile
也是寫入到文件,不同的是比File更加強(qiáng)大,可以指定當(dāng)文件達(dá)到一定大小(如20MB)時(shí),另起一個(gè)文件繼續(xù)寫入日志,另起一個(gè)文件就涉及到新文件的名字命名規(guī)則,因此需要配置文件命名規(guī)則
這種方式更加實(shí)用,因?yàn)槟悴豢赡芤恢蓖粋€(gè)文件中寫,如果一直寫,文件過(guò)大,打開(kāi)就會(huì)卡死,也不便于查找日志。
name(屬性):指定Appender的名字.
fileName(屬性):指定輸出日志的目的文件帶全路徑的文件名
PatternLayout(節(jié)點(diǎn)):輸出格式,不設(shè)置默認(rèn)為:%m%n
filePattern:指定新建日志文件的名稱格式.
Policies(節(jié)點(diǎn)):指定滾動(dòng)日志的策略,就是什么時(shí)候進(jìn)行新建日志文件輸出日志.
TimeBasedTriggeringPolicy(節(jié)點(diǎn)):Policies子節(jié)點(diǎn),基于時(shí)間的滾動(dòng)策略,interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour。modulate=true用來(lái)調(diào)整時(shí)間:比如現(xiàn)在是早上3am,interval是4,那么第一次滾動(dòng)是在4am,接著是8am,12am..而不是7am.
SizeBasedTriggeringPolicy(節(jié)點(diǎn)):Policies子節(jié)點(diǎn),基于指定文件大小的滾動(dòng)策略,size屬性用來(lái)定義每個(gè)日志文件的大小.
DefaultRolloverStrategy(節(jié)點(diǎn)):用來(lái)指定同一個(gè)文件夾下最多有幾個(gè)日志文件時(shí)開(kāi)始刪除最l舊的,創(chuàng)建新的(通過(guò)max屬性);可以指定壓縮級(jí)別(通過(guò)compressionLevel屬性),compressionLevel的值通常是一個(gè)介于0到9之間的整數(shù),其中:0表示無(wú)壓縮,1表示最快的壓縮速度(但壓縮率最低),9表示最高的壓縮率(但壓縮速度最慢)
Delete:清理舊日志文件的策略;basePath指定了日志文件所在的基目錄;maxDepth用于指定清理或刪除日志文件時(shí)搜索的目錄深度,值是一個(gè)整數(shù),表示從basePath開(kāi)始向下搜索的目錄層級(jí)數(shù)
IfFileName:Delete子節(jié)點(diǎn),用于匹配要?jiǎng)h除的文件名模式。glob接受一個(gè)通配符模式,用來(lái)匹配文件名。
IfLastModified:Delete子節(jié)點(diǎn),用于檢查文件的最后修改時(shí)間,并基于該時(shí)間點(diǎn)決定文件是否應(yīng)該被清理或刪除;age指定了文件最后修改時(shí)間與當(dāng)前時(shí)間之間最大允許的時(shí)間差
如果maxDepth="0",則只會(huì)考慮basePath所指向的目錄本身,不包括任何子目錄。
如果maxDepth="1",則會(huì)考慮basePath所指向的目錄及其直接子目錄。
如果maxDepth="2",則會(huì)考慮basePath所指向的目錄、其直接子目錄以及這些子目錄下的子目錄(即二級(jí)子目錄)。
2.4 Logger
Logger節(jié)點(diǎn)用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的class指定不同的日志級(jí)別等。level:日志輸出級(jí)別,共有8個(gè)級(jí)別,按照從低到高為: All < Trace < Debug < Info < Warn < Error < Fatal < OFF
root :設(shè)定根日志的日志級(jí)別
name:用來(lái)指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節(jié)點(diǎn).
AppenderRef:Logger的子節(jié)點(diǎn),用來(lái)指定該日志輸出到哪個(gè)Appender,如果沒(méi)有指定,就會(huì)默認(rèn)繼承自Root.如果指定了,那么會(huì)在指定的這個(gè)Appender和Root的Appender中都會(huì)輸出。
additivity:是否繼承root節(jié)點(diǎn),默認(rèn)是true繼承。默認(rèn)情況下子Logger會(huì)繼承父Logger的appender,也就是說(shuō)子Logger會(huì)在父Logger的appender里輸出。若是additivity設(shè)為false,則子Logger只會(huì)在自己的appender里輸出,而不會(huì)在父Logger的appender里輸出。
3.日志輸出模板參數(shù)介紹
格式化輸出:
%date{yyyy-MM-dd HH:mm:ss.SSS}: 簡(jiǎn)寫為%d 日期 2023-08-12 15:04:30,123
%thread: %t 線程名, main
%-5level:%p 日志級(jí)別,從左往右至少顯示5個(gè)字符寬度,不足補(bǔ)空格 INFO
%msg:%m 日志消息 info msg
%n: 換行符
{cyan}: 藍(lán)綠色(青色)
%logger{36}: %c 表示 Logger 名字最長(zhǎng)36個(gè)字符
%C: 類路徑 com.qq.demolog4j2.TestLog4j2
%M: 方法名 main
%F: 類名 TestLog4j2.java
%L: 行號(hào) 12
%l: 日志位置, 相當(dāng)于 %C.%M(%F.%L) com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
%highlight:高亮顯示,%highlight{%-5level}
如果控制臺(tái)輸出的日志級(jí)別沒(méi)有高亮顯示,Log4j2默認(rèn)關(guān)閉了Jansi:一個(gè)支持輸出ANSI顏色的類庫(kù) IDEA中,點(diǎn)擊右上角->Edit+Configurations,在VM+options中添加-Dlog4j.skipJansi=false
下面就是我在開(kāi)發(fā)中使用的一些配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<properties>
<!-- 日志打印級(jí)別 -->
<property name="LOG_LEVEL">INFO</property>
<!-- APP名稱 -->
<property name="APP_NAME" value="framework_project"/>
<!-- 日志文件存儲(chǔ)路徑 -->
<property name="LOG_HOME">/framework_project</property>
<!-- 存儲(chǔ)天數(shù) -->
<property name="LOG_MAX_HISTORY" value="60d"/>
<!-- 單個(gè)日志文件最大值, 單位 = KB, MB, GB -->
<property name="LOG_MAX_FILE_SIZE" value="10 MB"/>
<!-- 每天每個(gè)日志級(jí)別產(chǎn)生的文件最大數(shù)量 -->
<property name="LOG_TOTAL_NUMBER_DAILY" value="10"/>
<!-- 壓縮文件的類型,支持zip和gz,建議Linux用gz,Windows用zip -->
<property name="ARCHIVE_FILE_SUFFIX" value="zip"/>
<!-- 日志文件名 -->
<property name="LOG_FILE_NAME" value="${LOG_HOME}"/>
<property name="FILE_NAME_PATTERN" value="${LOG_HOME}/%d{yyyy-MM-dd}"/>
<!--日志輸出格式-控制臺(tái)彩色打印-->
<property name="ENCODER_PATTERN_CONSOLE">%blue{%d{yyyy-MM-dd HH:mm:ss.SSS}} | %highlight{%-5level}{ERROR=Bright
RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} | %yellow{%t} |
%cyan{%c{1.}} : %white{%msg%n}
</property>
<!--日志輸出格式-文件-->
<property name="ENCODER_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %5pid --- [%15.15t] %c{1.} [%L] : %m%n
</property>
<!--日志輸出格式-控制臺(tái)彩色打印-->
<property name="DEFAULT_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} %style{%5pid}{bright,magenta} --- [%17.17t] %cyan{%c{1.} [%L]} : %m%n
</property>
</properties>
<Appenders>
<!-- 控制臺(tái)的輸出配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!--輸出日志的格式-->
<PatternLayout pattern="${DEFAULT_PATTERN}"/>
</Console>
<!-- 新增包含所有級(jí)別日志的文件 Appender -->
<RollingFile name="RollingFileAllLevels" fileName="${LOG_FILE_NAME}/all.log"
filePattern="${FILE_NAME_PATTERN}/all.log">
<Filters>
<!-- 不過(guò)濾任何日志級(jí)別 -->
</Filters>
<PatternLayout pattern="${ENCODER_PATTERN}"/>
<Policies>
<!-- 歸檔每天的文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 限制單個(gè)文件大小 -->
<SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
</Policies>
<!-- 限制每天文件個(gè)數(shù) -->
<DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
<Delete basePath="${LOG_HOME}" maxDepth="1">
<IfFileName glob="*.all.*.log"/>
<IfLastModified age="${LOG_MAX_HISTORY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- 打印出所有的info及以下級(jí)別的信息,每次大小超過(guò)size進(jìn)行壓縮,作為存檔-->
<RollingFile name="RollingFileAll" fileName="${LOG_FILE_NAME}/info.log"
filePattern="${FILE_NAME_PATTERN}/info.log">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
<!--輸出日志的格式-->
<PatternLayout pattern="${ENCODER_PATTERN}"/>
<Policies>
<!-- 歸檔每天的文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 限制單個(gè)文件大小 -->
<SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
</Policies>
<!-- 限制每天文件個(gè)數(shù) -->
<DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
<Delete basePath="${LOG_HOME}" maxDepth="1">
<IfFileName glob=".info.*.log"/>
<IfLastModified age="${LOG_MAX_HISTORY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileDebug"
fileName="${LOG_FILE_NAME}/debug.log"
filePattern="${FILE_NAME_PATTERN}/debug.log">
<Filters>
<ThresholdFilter level="DEBUG"/>
<ThresholdFilter level="INFO" onMatch="DENY"
onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="${ENCODER_PATTERN}"/>
<Policies>
<!-- 歸檔每天的文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 限制單個(gè)文件大小 -->
<SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
</Policies>
<!-- 限制每天文件個(gè)數(shù) -->
<DefaultRolloverStrategy compressionLevel="9"
max="${LOG_TOTAL_NUMBER_DAILY}">
<Delete basePath="${LOG_HOME}" maxDepth="1">
<IfFileName glob="*.debug.*.log"/>
<IfLastModified age="${LOG_MAX_HISTORY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${LOG_FILE_NAME}/warn.log"
filePattern="${FILE_NAME_PATTERN}/warn.log">
<Filters>
<ThresholdFilter level="WARN"/>
<ThresholdFilter level="ERROR" onMatch="DENY"
onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="${ENCODER_PATTERN}"/>
<Policies>
<!-- 歸檔每天的文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 限制單個(gè)文件大小 -->
<SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
</Policies>
<!-- 限制每天文件個(gè)數(shù) -->
<DefaultRolloverStrategy compressionLevel="9"
max="${LOG_TOTAL_NUMBER_DAILY}">
<Delete basePath="${LOG_HOME}" maxDepth="1">
<IfFileName glob="*.warn.*.log"/>
<IfLastModified age="${LOG_MAX_HISTORY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileError"
fileName="${LOG_FILE_NAME}/error.log"
filePattern="${FILE_NAME_PATTERN}/error.log">
<Filters>
<ThresholdFilter level="ERROR"/>
</Filters>
<PatternLayout pattern="${ENCODER_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
<Delete basePath="${LOG_HOME}" maxDepth="1">
<IfFileName glob="*.error.*.log"/>
<IfLastModified age="${LOG_MAX_HISTORY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!--只有定義了logger并引入以上Appenders,Appender才會(huì)生效-->
<Loggers>
<root level="${LOG_LEVEL}">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileAll"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<!-- 添加新的Appender引用 -->
<appender-ref ref="RollingFileAllLevels"/>
</root>
</Loggers>
</configuration>4.知識(shí)擴(kuò)展
如何設(shè)置Log4j2的監(jiān)控間隔?
在 Log4j2 中,可以通過(guò)在配置文件中設(shè)置 monitorInterval 屬性來(lái)指定監(jiān)控配置文件變化的時(shí)間間隔。這個(gè)屬性告訴 Log4j2 每隔多少秒檢查一次配置文件是否有變化,如果有變化則自動(dòng)重新加載配置。以下是具體的設(shè)置方法和示例:
1. XML 配置文件示例
在 log4j2.xml 配置文件的根 <Configuration> 元素中添加 monitorInterval 屬性:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
在這個(gè)示例中,monitorInterval="30" 表示 Log4j2 每隔 30 秒檢查一次配置文件是否有變化。如果配置文件發(fā)生變化,Log4j2 會(huì)自動(dòng)重新加載配置。
2. JSON 配置文件示例
在 log4j2.json 配置文件中,可以通過(guò)在配置對(duì)象中添加 "monitorInterval" 屬性來(lái)設(shè)置監(jiān)控間隔:
{
"configuration": {
"status": "WARN",
"monitorInterval": 30,
"appenders": {
"console": {
"type": "Console",
"target": "SYSTEM_OUT",
"PatternLayout": {
"pattern": "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
}
}
},
"loggers": {
"root": {
"level": "info",
"appenderRefs": [
{
"ref": "console"
}
]
}
}
}
}3. YAML 配置文件示例
在 log4j2.yaml 配置文件中,可以通過(guò)在 configuration 對(duì)象中添加 monitorInterval 屬性來(lái)設(shè)置監(jiān)控間隔:
configuration:
status: WARN
monitorInterval: 30
appenders:
console:
type: Console
target: SYSTEM_OUT
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
loggers:
root:
level: info
appenderRefs:
- ref: console
4. 注意事項(xiàng)
監(jiān)控間隔單位:monitorInterval 的單位是秒。
最小間隔:Log4j2 要求 monitorInterval 的值至少為 1 秒。
性能影響:雖然監(jiān)控配置文件變化提供了一定的便利性,但頻繁的文件檢查可能會(huì)對(duì)性能產(chǎn)生輕微影響。因此,建議根據(jù)實(shí)際需求合理設(shè)置監(jiān)控間隔。
文件變化檢測(cè):Log4j2 通過(guò)檢測(cè)配置文件的最后修改時(shí)間(last-modified time)來(lái)判斷文件是否發(fā)生變化。如果文件系統(tǒng)或編輯工具沒(méi)有正確更新文件的最后修改時(shí)間,Log4j2 可能無(wú)法檢測(cè)到變化。
通過(guò)這些方法,你可以輕松設(shè)置 Log4j2 的監(jiān)控間隔,使其在配置文件發(fā)生變化時(shí)自動(dòng)重新加載配置,而無(wú)需重啟應(yīng)用程序。
到此這篇關(guān)于一文帶你搞定SpringBoot Log4j2日志配置文件的文章就介紹到這了,更多相關(guān)SpringBoot Log4j2日志配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 日志級(jí)別及配置詳解
- springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
- SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)
- Spring?Boot整合log4j2日志配置的詳細(xì)教程
- SpringBoot日志配置全過(guò)程
- Spring?Boot日志打印配置詳細(xì)介紹
- Springboot日志配置的實(shí)現(xiàn)示例
- SpringBoot3配置Logback日志滾動(dòng)文件的方法
- 如何為?Spring?Boot?項(xiàng)目配置?Logback?日志
- Spring Boot配置日志的實(shí)現(xiàn)步驟
相關(guān)文章
java?JVM-clinit指令實(shí)現(xiàn)原理面試精講
這篇文章主要介紹了java?JVM-clinit指令實(shí)現(xiàn)原理面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Spring Boot項(xiàng)目中實(shí)現(xiàn)文件上傳功能的示例
這篇文章主要介紹了Spring Boot項(xiàng)目中實(shí)現(xiàn)文件上傳功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問(wèn)題
這篇文章主要介紹了解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Spring Data 2027 動(dòng)態(tài)查詢功能及實(shí)踐
文章主要介紹了SpringData2027中的動(dòng)態(tài)查詢功能,包括QueryByExample、Specification、QueryDSL、CriteriaAPI和動(dòng)態(tài)JPQL等實(shí)現(xiàn)方式,文章詳細(xì)闡述了每種方式的原理、實(shí)踐方法及應(yīng)用場(chǎng)景,并提供了優(yōu)化性能、監(jiān)控調(diào)試和最佳實(shí)踐的建議,最后展望了該功能未來(lái)的發(fā)展趨勢(shì)2026-04-04
Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼
這篇文章主要為大家介紹了如何用Java語(yǔ)言實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的生成,項(xiàng)目采用了springboot,maven等技術(shù),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-02-02
Nacos配置中心的配置文件的匹配規(guī)則及說(shuō)明
這篇文章主要介紹了Nacos配置中心的配置文件的匹配規(guī)則及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

