Spring Boot中如何用Log4j将INFO和ERROR日志分别输出到不同文件
问题分析与解决方案
一、关于application.properties日志配置的问题
你遇到的logging.file重复配置后仅最后一个生效的问题,是因为Spring Boot的配置文件中重复的键会被后续的配置覆盖。而且默认的日志框架(比如Logback)本身不支持将不同级别的日志分别输出到不同文件,所以这种方式无法实现按级别分文件的需求,必须使用专门的日志配置文件(如logback.xml、log4j2.xml)来实现。
二、为什么你的log4j2.xml配置未生效?
你的配置文件存在几个关键问题:
- 使用了Log4j 1.x的类路径:你的配置里用的是
org.apache.log4j.*的类,但Log4j2的类路径是org.apache.logging.log4j.*,这会导致容器找不到对应的类,配置自然无法生效。 - 依赖未正确调整:Spring Boot默认使用Logback作为日志框架,如果你要切换到Log4j2,需要排除Logback的依赖,并引入Log4j2的相关依赖。
- 过滤器与Appender的配置不符合Log4j2规范:Log4j2的Appender和过滤器配置语法与Log4j 1.x差异较大,比如
RollingFileAppender的配置、级别过滤器的用法都不一样。
解决步骤与正确配置示例
1. 调整Maven/Gradle依赖(以Maven为例)
在pom.xml中排除默认的Logback依赖,引入Log4j2:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <!-- 排除默认的Logback依赖 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Log4j2依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
2. 修正后的log4j2.xml配置
下面是符合Log4j2规范的配置,实现按级别分文件输出+滚动日志:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <!-- 定义变量,方便维护路径 --> <Properties> <Property name="LOG_PATH">D:/LogDemo</Property> </Properties> <!-- DEBUG级别日志Appender --> <Appenders> <RollingFile name="DEBUG-LOG-FILE" fileName="${LOG_PATH}/Debug.log" filePattern="${LOG_PATH}/Debug.%d{yyyy-MM-dd}.log.zip"> <Filters> <!-- 只接受DEBUG级别,拒绝更高/更低级别 --> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="NEUTRAL"/> <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/> <Policies> <!-- 按天滚动日志 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <!-- 保留30天日志 --> <DefaultRolloverStrategy max="30"/> </RollingFile> <!-- ERROR级别日志Appender --> <RollingFile name="ERROR-LOG-FILE" fileName="${LOG_PATH}/Error.log" filePattern="${LOG_PATH}/Error.%d{yyyy-MM-dd}.log.zip"> <Filters> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <DefaultRolloverStrategy max="30"/> </RollingFile> <!-- INFO级别日志Appender --> <RollingFile name="INFO-LOG-FILE" fileName="${LOG_PATH}/Info.log" filePattern="${LOG_PATH}/Info.%d{yyyy-MM-dd}.log.zip"> <Filters> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="NEUTRAL"/> <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <DefaultRolloverStrategy max="30"/> </RollingFile> <!-- 控制台输出DEBUG级别日志 --> <Console name="STDOUT" target="SYSTEM_OUT"> <Filters> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout pattern="%d %-5p %logger{35} - %m%n"/> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="DEBUG-LOG-FILE"/> <AppenderRef ref="ERROR-LOG-FILE"/> <AppenderRef ref="INFO-LOG-FILE"/> <AppenderRef ref="STDOUT"/> </Root> </Loggers> </Configuration>
3. 额外注意事项
- 确保
log4j2.xml文件放在项目的src/main/resources目录下,Spring Boot会自动加载这个位置的配置文件。 - 如果是多模块项目,要确保依赖调整正确,避免多个日志框架冲突。
- 可以通过
logging.config属性指定自定义配置文件路径(比如logging.config=classpath:my-log4j2.xml),但默认位置下不需要额外配置。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

