Spring Boot 日志配置詳解:log4j2.xml 的完整配置指南
在現(xiàn)代企業(yè)級(jí)應(yīng)用開發(fā)中,日志管理是系統(tǒng)運(yùn)維和問題排查的重要組成部分。本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中配置 Log4j2,包括完整的 [log4j2.xml]配置文件和相關(guān)依賴設(shè)置。
一、為什么選擇 Log4j2?
Spring Boot 默認(rèn)使用 Logback 作為日志框架,但在某些場(chǎng)景下我們更傾向于使用 Log4j2:
- 性能優(yōu)勢(shì):Log4j2 使用異步日志記錄,在高并發(fā)環(huán)境下性能表現(xiàn)更優(yōu)
- 無鎖設(shè)計(jì):采用 LMAX Disruptor 庫(kù)實(shí)現(xiàn)無鎖異步日志記錄
- 靈活配置:支持更豐富的日志過濾和格式化選項(xiàng)
- 動(dòng)態(tài)更新:配置文件修改后無需重啟應(yīng)用即可生效
二、Maven 依賴配置
1. 排除默認(rèn)日志框架
首先需要排除 Spring Boot 默認(rèn)的 Logback 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>2. 添加 Log4j2 依賴
然后添加 Log4j2 相關(guān)依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 高性能異步日志庫(kù) -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.4</version>
</dependency>三、application.yml 配置
在 [application-pre.yml] 文件中指定日志配置文件:
logging: config: classpath:log4j2.xml
這樣配置可以讓 Spring Boot 加載自定義的 Log4j2 配置文件。
3、log4j2.xml 完整配置詳解
1. Properties 屬性定義
<Properties>
<property name="LOG_HOME" value="/home/test/doc/log"/>
<property name="APP_CODE" value="file_log"/>
<property name="LOG_LEVEL_PATTERN" value="%-5p"/>
<property name="INSTANCE_INFO_PATTERN" value="${hostName} | ${sys:user.name}"/>
<property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
<property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
<property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID} | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
<property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | FEIA | FLEP-INAPP | %t | ${CODE_INFO_PATTERN} | %m%n"/>
<property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
</Properties>這里定義了日志系統(tǒng)的各種屬性,包括日志存儲(chǔ)路徑、日志級(jí)別格式、實(shí)例信息格式等。
2. Appenders 輸出配置
控制臺(tái)輸出配置
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n" />
</Console>文件滾動(dòng)策略配置
Log4j2 支持多種滾動(dòng)策略,以下是一些常用配置:
事件日志配置:
<RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="*/event.log.*" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>應(yīng)用日志配置:
<RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
<PatternLayout>
<Pattern>${APP_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="*/app.log.*" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>告警日志配置:
<RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
<thresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${ALERT_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="*/alert.log.*" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>錯(cuò)誤日志配置:
<RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
<thresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${APP_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="*/error.log.*" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>3. Loggers 日志記錄器配置
Root Logger 配置
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="AppLogFile" />
<AppenderRef ref="AlertLogFile" />
<AppenderRef ref="ErrorLogFile" />
</Root>異步日志記錄器配置
<AsyncLogger name="event" level="ALL" additivity="false">
<AppenderRef ref="EventLogFile" />
</AsyncLogger>特定包的日志級(jí)別配置
<logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <logger name="com.cisdi.colmet.core.mapper" level="DEBUG"/>
3. Loggers 日志記錄器配置
1. 異步日志配置
為了獲得更好的性能,可以使用異步日志記錄:
- 在根節(jié)點(diǎn)添加
packages="com.lmax.disruptor"屬性 - 使用
<AsyncLogger>和<AsyncRoot>進(jìn)行異步日志記錄
2. 日志追蹤ID配置
配置中的 %X{TRACE_ID} 允許在日志中加入分布式追蹤ID,方便問題定位。
3. 文件清理策略
配置中的 <Delete> 元素定義了日志文件的自動(dòng)清理策略,保留最近30天的日志文件。
4. 性能優(yōu)化建議
- 合理設(shè)置日志級(jí)別,避免輸出過多調(diào)試信息
- 使用異步日志記錄提高性能
- 合理設(shè)置日志文件大小和保留策略
- 定期監(jiān)控日志磁盤使用情況
4、log4j2.xml 完整配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="600">
<Properties>
<!--<property name="LOG_HOME" value="${sys:user.home}/home/logs"/>-->
<!--<property name="LOG_HOME" value="D:\doc\log"/>-->
<property name="LOG_HOME" value="./logs"/>
<property name="APP_CODE" value="file_log"/>
<property name="LOG_LEVEL_PATTERN" value="%-5p"/>
<property name="INSTANCE_INFO_PATTERN" value="${hostName} | ${sys:user.name}"/>
<property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
<property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
<property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID} | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
<property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | FEIA | FLEP-INAPP | %t | ${CODE_INFO_PATTERN} | %m%n"/>
<property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
</Properties>
<Appenders>
<!--控制臺(tái)輸出的相關(guān)配置-->
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n" />
</Console>
<!--打印所有的info及以下的級(jí)別的信息,每次超過size,則這size大小的日志會(huì)自動(dòng)存入年份-月份創(chuàng)建的文件夾下進(jìn)行壓縮存檔-->
<RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<!--保留最近30天的日志-->
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth = "2">
<IfFileName glob = "*/event.log.*" />
<IfLastModified age = "30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
<PatternLayout>
<Pattern>${APP_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<!--保留最近30天的日志-->
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth = "2">
<IfFileName glob = "*/app.log.*" />
<IfLastModified age = "30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
<thresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${ALERT_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth = "2">
<IfFileName glob = "*/alert.log.*" />
<IfLastModified age = "30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
<thresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${APP_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_HOME}" maxDepth = "2">
<IfFileName glob = "*/error.log.*" />
<IfLastModified age = "30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="AppLogFile" />
<AppenderRef ref="AlertLogFile" />
<AppenderRef ref="ErrorLogFile" />
</Root>
<AsyncLogger name="event" level="ALL" additivity="false">
<AppenderRef ref="EventLogFile" />
</AsyncLogger>
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="com.cisdi.colmet.core.mapper" level="DEBUG"/>
</Loggers>
</Configuration>五、總結(jié)
通過以上配置,我們可以構(gòu)建一個(gè)功能完善、性能優(yōu)異的 Log4j2 日志系統(tǒng)。這種配置不僅滿足了日常開發(fā)和運(yùn)維需求,還提供了高性能的異步日志記錄能力。在實(shí)際項(xiàng)目中,可以根據(jù)具體需求調(diào)整日志級(jí)別、輸出格式和文件策略,以達(dá)到最佳的監(jiān)控和維護(hù)效果。
記住,良好的日志配置是系統(tǒng)穩(wěn)定運(yùn)行和快速排錯(cuò)的重要保障,合理的日志管理策略能夠顯著提升系統(tǒng)的可維護(hù)性和可觀測(cè)性。
到此這篇關(guān)于Spring Boot 日志配置詳解:log4j2.xml 的完整配置指南的文章就介紹到這了,更多相關(guān)Spring Boot log4j2.xml 日志配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+log4j2.xml使用application.yml屬性值問題
- springboot?log4j2.xml如何讀取application.yml中屬性值
- springboot中l(wèi)ogback日志配置的詳細(xì)說明
- Springboot日志配置的實(shí)現(xiàn)示例
- SpringBoot 下在 yml 中的 logging 日志配置方法
- SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置指南
- SpringBoot集成slf4j日志配置的方法
- SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句)
- 基于logback 實(shí)現(xiàn)springboot超級(jí)詳細(xì)的日志配置
相關(guān)文章
SpringBoot使用JDBC獲取相關(guān)的數(shù)據(jù)方法
這篇文章主要介紹了SpringBoot使用JDBC獲取相關(guān)的數(shù)據(jù)方法,JDBC與數(shù)據(jù)庫(kù)建立連接、發(fā)送 操作數(shù)據(jù)庫(kù)的語(yǔ)句并處理結(jié)果,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
Java實(shí)時(shí)日志輸出至前臺(tái)的實(shí)現(xiàn)步驟
在Java應(yīng)用程序中實(shí)現(xiàn)將實(shí)時(shí)日志輸出至前臺(tái)(如Web頁(yè)面或桌面應(yīng)用程序),通常涉及到幾個(gè)關(guān)鍵組件和技術(shù)的選擇,下面將詳細(xì)介紹如何使用Java實(shí)現(xiàn)實(shí)時(shí)日志輸出至前臺(tái),并結(jié)合具體的實(shí)現(xiàn)技術(shù)和框架來說明,需要的朋友可以參考下2025-10-10
基于Spring-AOP實(shí)現(xiàn)自定義分片工具詳解
隨著數(shù)據(jù)量的增長(zhǎng),在與其他系統(tǒng)交互時(shí),批量接口會(huì)出現(xiàn)超時(shí)現(xiàn)象,發(fā)現(xiàn)原批量接口在實(shí)現(xiàn)時(shí),沒有做分片處理。由于與其他系統(tǒng)交互比較多,一個(gè)一個(gè)接口去做分片優(yōu)化,改動(dòng)量較大,所以考慮通過AOP解決此問題,感興趣的可以了解一下2022-11-11
java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例
用Java創(chuàng)建文件或目錄非常簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
關(guān)于Java雙大括號(hào){{}}的具體使用
本文主要介紹了關(guān)于Java雙大括號(hào){{}}的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
REST架構(gòu)及RESTful應(yīng)用程序簡(jiǎn)介
這篇文章主要為大家介紹了REST架構(gòu)及RESTful的應(yīng)用程序簡(jiǎn)介,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法
當(dāng)數(shù)據(jù)庫(kù)連接池中的連接被創(chuàng)建而長(zhǎng)時(shí)間不使用的情況下,該連接會(huì)自動(dòng)回收并失效,就導(dǎo)致客戶端程序報(bào)“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常問題,下面給大家分享解決方案,一起看看吧2024-03-03

