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

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

