Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志:Log4j2 基本概念;Log4j2 多环境日志配置策略
Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志:Log4j2 基本概念;Log4j2 多环境日志配置策略
- Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志
- 日志配置
- 1. Log4j2 基本概念
- 2. Log4j2 多环境日志配置策略
- 3. 配置实践
- 修改配置文件
- log4j2-spring-dev.xml
- log4j2-spring-test.xml
- log4j2-spring-prod.xml
Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志
日志配置
在企业级 Java 应用中,日志不仅用于排查问题,也用于业务监控、性能分析和审计。不同环境(开发、测试、生产)的日志需求各不相同:
- 开发环境:需要详细调试信息(DEBUG/TRACE),同时希望在控制台可见。
- 测试环境:日志比开发环境少,但需要持久化到文件,以便排查问题。
- 生产环境:日志主要关注 WARN/ERROR,日志文件需要按日期和大小滚动,保证长期可追溯,同时避免占满磁盘。
本文将详细讲解如何使用 Log4j2 配置多环境日志,以及如何管理滚动文件和日志级别。
1. Log4j2 基本概念
Log4j2 主要由以下几个部分组成:
- Logger:日志记录器,用于在代码中调用日志方法。
- Appender:日志输出器,决定日志输出到控制台、文件或远程系统。
- Layout:日志输出格式,例如普通文本、JSON。
- Filter:日志过滤器,用于控制哪些日志可以输出。
日志级别优先级(高到低):
OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
2. Log4j2 多环境日志配置策略
不同环境可以使用不同配置文件,例如:
| 环境 | 文件名 | 输出 | 日志级别 |
|---|---|---|---|
| 开发 | log4j2-spring-dev.xml | 控制台 + 测试文件 | DEBUG |
| 测试 | log4j2-spring-test.xml | 文件输出 | INFO |
| 生产 | log4j2-spring-prod.xml | 滚动文件 | INFO/WARN/ERROR |
优点
- 配置独立,互不影响
- 无需在同一文件中使用条件判断
- 环境切换简单:通过 Spring Boot 的
spring.profiles.active配合logging.config指定对应的配置文件,例如:
spring:profiles:active: dev # 当前激活环境
logging:config: classpath:log/log4j2-spring-${spring.profiles.active}.xml
Spring Boot 会根据 ${spring.profiles.active} 自动加载对应的 Log4j2 配置文件,实现多环境日志配置。
3. 配置实践
修改配置文件
spring:application:name: spring-boot-demo-2.7.18profiles:active: devconfig:# 导入连接池配置import: datasource/datasource-${spring.profiles.active}.yml
logging:config: classpath:log/log4j2-spring-${spring.profiles.active}.xml
log4j2-spring-dev.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--==========================================================Log4j2 日志配置==========================================================日志级别优先级(高到低):OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL- OFF:关闭日志- FATAL:严重错误,系统崩溃- ERROR:业务错误,可继续运行- WARN:警告信息- INFO:一般信息- DEBUG:开发调试- TRACE:最详细日志- ALL:记录所有日志
--><!--configuration:Log4j2 根节点,全局配置属性:- status:Log4j2 内部日志级别可选值:OFF | FATAL | ERROR | WARN | INFO | DEBUG | TRACE- monitorInterval:配置热加载间隔(秒),0表示禁用- packages:自定义插件扫描包
-->
<configuration status="WARN" monitorInterval="30"><!-- ==========================================================一、Appender(日志输出器)==========================================================Appender 定义日志输出目标及格式常用类型:- Console:输出到控制台- File:普通文件- RollingFile:支持按时间/大小滚动--><appenders><!-- ===================== 控制台输出(开发专用) ===================== --><Console name="Console" target="SYSTEM_OUT"><!-- PatternLayout 定义日志输出格式 --><!--常用占位符:%d{yyyy-MM-dd HH:mm:ss.SSS} 时间%pid 进程ID%t/%T 线程名/线程ID%X{traceId}, %X{spanId} MDC 链路追踪%level 日志级别%c 类名%msg 日志内容%throwable 异常堆栈--><PatternLayoutpattern="%style{[%d{yyyy-MM-dd HH:mm:ss.SSS}]}{CYAN} %style{[PID=%pid]}{MAGENTA} %style{[thread=%t, id=%T]}{BLUE} %style{[traceId=%X{traceId}, spanId=%X{spanId}]}{BLUE} %highlight{%style{[%level]}{BRIGHT}} %style{---}{DEFAULT} %highlight{%style{%c}{BRIGHT}} : %msg%n%throwable"disableAnsi="false"noConsoleNoAnsi="false"charset="UTF-8"/><!-- ThresholdFilter 过滤日志级别 --><ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/></Console><!-- ===================== 测试文件输出(调试专用) ===================== --><File name="Test" fileName="logs/test.log" append="false" bufferedIO="true" immediateFlush="true"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- ======================= INFO 日志滚动文件 ======================= --><RollingFile name="RollingFileInfo"fileName="logs/info.log"filePattern="logs/%d{yyyy-MM-dd}/info-%i.log.gz"><!-- 仅记录 INFO 及以下级别 --><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><!-- 每天凌晨滚动 --><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!-- 文件超过 100MB 自动滚动 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- 每天最多保留 5 个文件,超出删除最旧 --><DefaultRolloverStrategy max="5"/></RollingFile><!-- ======================= WARN 日志滚动文件 ======================= --><RollingFile name="RollingFileWarn"fileName="logs/warn.log"filePattern="logs/%d{yyyy-MM-dd}/warn-%i.log.gz"><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="5"/></RollingFile><!-- ======================= ERROR 日志滚动文件 ======================= --><RollingFile name="RollingFileError"fileName="logs/error.log"filePattern="logs/%d{yyyy-MM-dd}/error-%i.log.gz"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="5"/></RollingFile></appenders><!-- ==========================================================二、Logger(日志记录器)==========================================================Logger 定义不同包/类的日志输出规则--><loggers><!-- ======================= 第三方包日志过滤 ======================= --><logger name="com.alibaba" level="WARN"/><logger name="com.baomidou" level="WARN"/><logger name="com.ulisesbocchio.jasyptspringboot" level="WARN"/><logger name="springfox.documentation" level="WARN"/><logger name="org.hibernate.validator" level="ERROR"/><!-- ======================= 根日志器 ======================= --><!-- Root Logger:全局日志入口 --><!--属性:- level:全局日志输出级别可选值:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF- additivity:是否继承父 Logger(默认 true)--><root level="all"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/><appender-ref ref="Test"/></root></loggers></configuration>
log4j2-spring-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--==========================================================Log4j2 日志配置==========================================================日志级别优先级(高到低):OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL- OFF:关闭日志- FATAL:严重错误,系统崩溃- ERROR:业务错误,可继续运行- WARN:警告信息- INFO:一般信息- DEBUG:开发调试- TRACE:最详细日志- ALL:记录所有日志
--><!--configuration:Log4j2 根节点,全局配置属性:- status:Log4j2 内部日志级别可选值:OFF | FATAL | ERROR | WARN | INFO | DEBUG | TRACE- monitorInterval:配置热加载间隔(秒),0表示禁用- packages:自定义插件扫描包
-->
<configuration status="WARN" monitorInterval="30"><!-- ==========================================================一、Appender(日志输出器)==========================================================Appender 定义日志输出目标及格式常用类型:- Console:输出到控制台- File:普通文件- RollingFile:支持按时间/大小滚动--><appenders><!-- ===================== 控制台输出(开发专用) ===================== --><Console name="Console" target="SYSTEM_OUT"><!-- PatternLayout 定义日志输出格式 --><!--常用占位符:%d{yyyy-MM-dd HH:mm:ss.SSS} 时间%pid 进程ID%t/%T 线程名/线程ID%X{traceId}, %X{spanId} MDC 链路追踪%level 日志级别%c 类名%msg 日志内容%throwable 异常堆栈--><PatternLayoutpattern="%style{[%d{yyyy-MM-dd HH:mm:ss.SSS}]}{CYAN} %style{[PID=%pid]}{MAGENTA} %style{[thread=%t, id=%T]}{BLUE} %style{[traceId=%X{traceId}, spanId=%X{spanId}]}{BLUE} %highlight{%style{[%level]}{BRIGHT}} %style{---}{DEFAULT} %highlight{%style{%c}{BRIGHT}} : %msg%n%throwable"disableAnsi="false"noConsoleNoAnsi="false"charset="UTF-8"/><!-- ThresholdFilter 过滤日志级别 --><ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/></Console><!-- ===================== 测试文件输出(调试专用) ===================== --><File name="Test" fileName="logs/test.log" append="false" bufferedIO="true" immediateFlush="true"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- ======================= INFO 日志滚动文件 ======================= --><RollingFile name="RollingFileInfo"fileName="logs/info.log"filePattern="logs/%d{yyyy-MM-dd}/info-%i.log.gz"><!-- 仅记录 INFO 及以下级别 --><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><!-- 每天凌晨滚动 --><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!-- 文件超过 100MB 自动滚动 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- 每天最多保留 5 个文件,超出删除最旧 --><DefaultRolloverStrategy max="5"/></RollingFile><!-- ======================= WARN 日志滚动文件 ======================= --><RollingFile name="RollingFileWarn"fileName="logs/warn.log"filePattern="logs/%d{yyyy-MM-dd}/warn-%i.log.gz"><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="5"/></RollingFile><!-- ======================= ERROR 日志滚动文件 ======================= --><RollingFile name="RollingFileError"fileName="logs/error.log"filePattern="logs/%d{yyyy-MM-dd}/error-%i.log.gz"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="5"/></RollingFile></appenders><!-- ==========================================================二、Logger(日志记录器)==========================================================Logger 定义不同包/类的日志输出规则--><loggers><!-- ======================= 第三方包日志过滤 ======================= --><logger name="com.alibaba" level="WARN"/><logger name="com.baomidou" level="WARN"/><logger name="com.ulisesbocchio.jasyptspringboot" level="WARN"/><logger name="springfox.documentation" level="WARN"/><logger name="org.hibernate.validator" level="ERROR"/><!-- ======================= 根日志器 ======================= --><!-- Root Logger:全局日志入口 --><!--属性:- level:全局日志输出级别可选值:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF- additivity:是否继承父 Logger(默认 true)--><root level="all">
<!-- <appender-ref ref="Console"/>--><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/><appender-ref ref="Test"/></root></loggers></configuration>
log4j2-spring-prod.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--==========================================================Log4j2 日志配置==========================================================日志级别优先级(高到低):OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL- OFF:关闭日志- FATAL:严重错误,系统崩溃- ERROR:业务错误,可继续运行- WARN:警告信息- INFO:一般信息- DEBUG:开发调试- TRACE:最详细日志- ALL:记录所有日志
--><!--configuration:Log4j2 根节点,全局配置属性:- status:Log4j2 内部日志级别可选值:OFF | FATAL | ERROR | WARN | INFO | DEBUG | TRACE- monitorInterval:配置热加载间隔(秒),0表示禁用- packages:自定义插件扫描包
-->
<configuration status="WARN" monitorInterval="30"><!-- ==========================================================一、Appender(日志输出器)==========================================================Appender 定义日志输出目标及格式常用类型:- Console:输出到控制台- File:普通文件- RollingFile:支持按时间/大小滚动--><appenders><!-- ===================== 控制台输出(开发专用) ===================== --><Console name="Console" target="SYSTEM_OUT"><!-- PatternLayout 定义日志输出格式 --><!--常用占位符:%d{yyyy-MM-dd HH:mm:ss.SSS} 时间%pid 进程ID%t/%T 线程名/线程ID%X{traceId}, %X{spanId} MDC 链路追踪%level 日志级别%c 类名%msg 日志内容%throwable 异常堆栈--><PatternLayoutpattern="%style{[%d{yyyy-MM-dd HH:mm:ss.SSS}]}{CYAN} %style{[PID=%pid]}{MAGENTA} %style{[thread=%t, id=%T]}{BLUE} %style{[traceId=%X{traceId}, spanId=%X{spanId}]}{BLUE} %highlight{%style{[%level]}{BRIGHT}} %style{---}{DEFAULT} %highlight{%style{%c}{BRIGHT}} : %msg%n%throwable"disableAnsi="false"noConsoleNoAnsi="false"charset="UTF-8"/><!-- ThresholdFilter 过滤日志级别 --><ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/></Console><!-- ===================== 测试文件输出(调试专用) ===================== --><File name="Test" fileName="logs/test.log" append="false" bufferedIO="true" immediateFlush="true"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- ======================= INFO 日志滚动文件 ======================= --><RollingFile name="RollingFileInfo"fileName="logs/info.log"filePattern="logs/%d{yyyy-MM-dd}/info-%i.log.gz"><!-- 仅记录 INFO 及以下级别 --><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><!-- 每天凌晨滚动 --><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!-- 文件超过 100MB 自动滚动 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- 每天最多保留 5 个文件,超出删除最旧 --><DefaultRolloverStrategy max="5"/></RollingFile><!-- ======================= WARN 日志滚动文件 ======================= --><RollingFile name="RollingFileWarn"fileName="logs/warn.log"filePattern="logs/%d{yyyy-MM-dd}/warn-%i.log.gz"><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="5"/></RollingFile><!-- ======================= ERROR 日志滚动文件 ======================= --><RollingFile name="RollingFileError"fileName="logs/error.log"filePattern="logs/%d{yyyy-MM-dd}/error-%i.log.gz"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [thread=%t, id=%T] [traceId=%X{traceId}, spanId=%X{spanId}] - %c - %m%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="5"/></RollingFile></appenders><!-- ==========================================================二、Logger(日志记录器)==========================================================Logger 定义不同包/类的日志输出规则--><loggers><!-- ======================= 第三方包日志过滤 ======================= --><logger name="com.alibaba" level="WARN"/><logger name="com.baomidou" level="WARN"/><logger name="com.ulisesbocchio.jasyptspringboot" level="WARN"/><logger name="springfox.documentation" level="WARN"/><logger name="org.hibernate.validator" level="ERROR"/><!-- ======================= 根日志器 ======================= --><!-- Root Logger:全局日志入口 --><!--属性:- level:全局日志输出级别可选值:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, ALL, OFF- additivity:是否继承父 Logger(默认 true)--><root level="all">
<!-- <appender-ref ref="Console"/>--><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/>
<!-- <appender-ref ref="Test"/>--></root></loggers></configuration>