一文帶你搞定SpringBoot Log4j2日志配置文件
1.在 Spring Boot 應(yīng)用中集成 Log4j2
首先在項目pom文件中引入Log4j的依賴
<!--log4j2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
在當(dāng)前項目的resource目錄下增加文件 log4j2.xml
下面介紹配置文件中各個節(jié)點,感興趣的小伙伴也可以去官網(wǎng)查看
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,一般只設(shè)置默認(rèn):SYSTEM_OUT.
- PatternLayout(節(jié)點):指定輸出日志的格式,可以使用pattern屬性與Properties中定義的日志打印模板常量相結(jié)合,控制日志輸出的模版,不設(shè)置則默認(rèn)為:%m%n
2.3.2 File
文件輸出源,用于將日志寫入到指定的文件,需要配置輸入到哪個位置(例如:D:/logs/info.log)
- name(屬性)::指定Appender的名字.
- fileName(屬性):指定輸出日志的目的文件帶全路徑的文件名.
- PatternLayout(節(jié)點):輸出格式,不設(shè)置默認(rèn)為:%m%n.
2.3.3 RollingFile
也是寫入到文件,不同的是比File更加強大,可以指定當(dāng)文件達到一定大?。ㄈ?0MB)時,另起一個文件繼續(xù)寫入日志,另起一個文件就涉及到新文件的名字命名規(guī)則,因此需要配置文件命名規(guī)則
這種方式更加實用,因為你不可能一直往一個文件中寫,如果一直寫,文件過大,打開就會卡死,也不便于查找日志。
name(屬性):指定Appender的名字.
fileName(屬性):指定輸出日志的目的文件帶全路徑的文件名
PatternLayout(節(jié)點):輸出格式,不設(shè)置默認(rèn)為:%m%n
filePattern:指定新建日志文件的名稱格式.
Policies(節(jié)點):指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志.
TimeBasedTriggeringPolicy(節(jié)點):Policies子節(jié)點,基于時間的滾動策略,interval屬性用來指定多久滾動一次,默認(rèn)是1 hour。modulate=true用來調(diào)整時間:比如現(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é)點,用于檢查文件的最后修改時間,并基于該時間點決定文件是否應(yīng)該被清理或刪除;age指定了文件最后修改時間與當(dāng)前時間之間最大允許的時間差
如果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 :設(shè)定根日志的日志級別
name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節(jié)點.
AppenderRef:Logger的子節(jié)點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認(rèn)繼承自Root.如果指定了,那么會在指定的這個Appender和Root的Appender中都會輸出。
additivity:是否繼承root節(jié)點,默認(rèn)是true繼承。默認(rèn)情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender里輸出。若是additivity設(shè)為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: 日志位置, 相當(dāng)于 %C.%M(%F.%L) com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
%highlight:高亮顯示,%highlight{%-5level}
如果控制臺輸出的日志級別沒有高亮顯示,Log4j2默認(rèn)關(guān)閉了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"/> <!-- 每天每個日志級別產(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}"/> <!--日志輸出格式-控制臺彩色打印--> <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.知識擴展
如何設(shè)置Log4j2的監(jiān)控間隔?
在 Log4j2 中,可以通過在配置文件中設(shè)置 monitorInterval 屬性來指定監(jiān)控配置文件變化的時間間隔。這個屬性告訴 Log4j2 每隔多少秒檢查一次配置文件是否有變化,如果有變化則自動重新加載配置。以下是具體的設(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>
在這個示例中,monitorInterval="30" 表示 Log4j2 每隔 30 秒檢查一次配置文件是否有變化。如果配置文件發(fā)生變化,Log4j2 會自動重新加載配置。
2. JSON 配置文件示例
在 log4j2.json 配置文件中,可以通過在配置對象中添加 "monitorInterval" 屬性來設(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 配置文件中,可以通過在 configuration 對象中添加 monitorInterval 屬性來設(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. 注意事項
監(jiān)控間隔單位:monitorInterval 的單位是秒。
最小間隔:Log4j2 要求 monitorInterval 的值至少為 1 秒。
性能影響:雖然監(jiān)控配置文件變化提供了一定的便利性,但頻繁的文件檢查可能會對性能產(chǎn)生輕微影響。因此,建議根據(jù)實際需求合理設(shè)置監(jiān)控間隔。
文件變化檢測:Log4j2 通過檢測配置文件的最后修改時間(last-modified time)來判斷文件是否發(fā)生變化。如果文件系統(tǒng)或編輯工具沒有正確更新文件的最后修改時間,Log4j2 可能無法檢測到變化。
通過這些方法,你可以輕松設(shè)置 Log4j2 的監(jiān)控間隔,使其在配置文件發(fā)生變化時自動重新加載配置,而無需重啟應(yīng)用程序。
到此這篇關(guān)于一文帶你搞定SpringBoot Log4j2日志配置文件的文章就介紹到這了,更多相關(guān)SpringBoot Log4j2日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot+swagger2.10.5+mybatis-plus 入門詳解
這篇文章主要介紹了springboot+swagger2.10.5+mybatis-plus 入門,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Java使用IOC控制反轉(zhuǎn)的三種設(shè)計模式詳解
這篇文章主要為大家詳細(xì)介紹了Java使用IOC控制反轉(zhuǎn)的三種設(shè)計模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解
這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個Web安全配置類上,實現(xiàn)了接口,需要的朋友可以參考下2023-12-12詳解mybatis collection標(biāo)簽一對多的使用
這篇文章主要介紹了mybatis collection標(biāo)簽一對多的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作
這篇文章主要介紹了SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,主要使用Jpa連接數(shù)據(jù)庫對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,需要的朋友可以參考下2023-05-05java啟動jar包修改JVM默認(rèn)內(nèi)存問題
這篇文章主要介紹了java啟動jar包修改JVM默認(rèn)內(nèi)存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02