Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志:Log4j2 基本概念;Log4j2 多环境日志配置策略
- [Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志](#Spring Boot 2.7.18(最终 2.x 系列版本)8 - 日志)
-
- 日志配置
-
- [1. Log4j2 基本概念](#1. Log4j2 基本概念)
- [2. Log4j2 多环境日志配置策略](#2. Log4j2 多环境日志配置策略)
- [3. 配置实践](#3. 配置实践)
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指定对应的配置文件,例如:
yaml
spring:
profiles:
active: dev # 当前激活环境
logging:
config: classpath:log/log4j2-spring-${spring.profiles.active}.xml
Spring Boot 会根据 ${spring.profiles.active} 自动加载对应的 Log4j2 配置文件,实现多环境日志配置。
3. 配置实践
修改配置文件
yaml
spring:
application:
name: spring-boot-demo-2.7.18
profiles:
active: dev
config:
# 导入连接池配置
import: datasource/datasource-${spring.profiles.active}.yml
logging:
config: classpath:log/log4j2-spring-${spring.profiles.active}.xml
log4j2-spring-dev.xml
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 异常堆栈
-->
<PatternLayout
pattern="%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
<?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 异常堆栈
-->
<PatternLayout
pattern="%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
<?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 异常堆栈
-->
<PatternLayout
pattern="%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>