Spring Boot 日志配置詳解:log4j2.xml 的完整配置指南
在現(xiàn)代企業(yè)級應用開發(fā)中,日志管理是系統(tǒng)運維和問題排查的重要組成部分。本文將詳細介紹如何在 Spring Boot 項目中配置 Log4j2,包括完整的 [log4j2.xml]配置文件和相關依賴設置。
一、為什么選擇 Log4j2?
Spring Boot 默認使用 Logback 作為日志框架,但在某些場景下我們更傾向于使用 Log4j2:
- 性能優(yōu)勢:Log4j2 使用異步日志記錄,在高并發(fā)環(huán)境下性能表現(xiàn)更優(yōu)
- 無鎖設計:采用 LMAX Disruptor 庫實現(xiàn)無鎖異步日志記錄
- 靈活配置:支持更豐富的日志過濾和格式化選項
- 動態(tài)更新:配置文件修改后無需重啟應用即可生效
二、Maven 依賴配置
1. 排除默認日志框架
首先需要排除 Spring Boot 默認的 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 相關依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 高性能異步日志庫 -->
<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)的各種屬性,包括日志存儲路徑、日志級別格式、實例信息格式等。
2. Appenders 輸出配置
控制臺輸出配置
<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>文件滾動策略配置
Log4j2 支持多種滾動策略,以下是一些常用配置:
事件日志配置:
<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>應用日志配置:
<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>錯誤日志配置:
<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>特定包的日志級別配置
<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é)點添加
packages="com.lmax.disruptor"屬性 - 使用
<AsyncLogger>和<AsyncRoot>進行異步日志記錄
2. 日志追蹤ID配置
配置中的 %X{TRACE_ID} 允許在日志中加入分布式追蹤ID,方便問題定位。
3. 文件清理策略
配置中的 <Delete> 元素定義了日志文件的自動清理策略,保留最近30天的日志文件。
4. 性能優(yōu)化建議
- 合理設置日志級別,避免輸出過多調(diào)試信息
- 使用異步日志記錄提高性能
- 合理設置日志文件大小和保留策略
- 定期監(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>
<!--控制臺輸出的相關配置-->
<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及以下的級別的信息,每次超過size,則這size大小的日志會自動存入年份-月份創(chuà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>
<!--保留最近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)建一個功能完善、性能優(yōu)異的 Log4j2 日志系統(tǒng)。這種配置不僅滿足了日常開發(fā)和運維需求,還提供了高性能的異步日志記錄能力。在實際項目中,可以根據(jù)具體需求調(diào)整日志級別、輸出格式和文件策略,以達到最佳的監(jiān)控和維護效果。
記住,良好的日志配置是系統(tǒng)穩(wěn)定運行和快速排錯的重要保障,合理的日志管理策略能夠顯著提升系統(tǒng)的可維護性和可觀測性。
到此這篇關于Spring Boot 日志配置詳解:log4j2.xml 的完整配置指南的文章就介紹到這了,更多相關Spring Boot log4j2.xml 日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot+log4j2.xml使用application.yml屬性值問題
- springboot?log4j2.xml如何讀取application.yml中屬性值
- springboot中l(wèi)ogback日志配置的詳細說明
- Springboot日志配置的實現(xiàn)示例
- SpringBoot 下在 yml 中的 logging 日志配置方法
- SpringBoot打印系統(tǒng)執(zhí)行的sql語句及日志配置指南
- SpringBoot集成slf4j日志配置的方法
- SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)
- 基于logback 實現(xiàn)springboot超級詳細的日志配置
相關文章
SpringBoot使用JDBC獲取相關的數(shù)據(jù)方法
這篇文章主要介紹了SpringBoot使用JDBC獲取相關的數(shù)據(jù)方法,JDBC與數(shù)據(jù)庫建立連接、發(fā)送 操作數(shù)據(jù)庫的語句并處理結(jié)果,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
java中實現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實例
用Java創(chuàng)建文件或目錄非常簡單,下面這篇文章主要給大家介紹了關于java中實現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實例,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01
java.sql.SQLRecoverableException關閉的連接異常問題及解決辦法
當數(shù)據(jù)庫連接池中的連接被創(chuàng)建而長時間不使用的情況下,該連接會自動回收并失效,就導致客戶端程序報“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關閉的連接”異常問題,下面給大家分享解決方案,一起看看吧2024-03-03

