Spring Boot中log4j2.xml未生效,无法生成分目录日志求助
问题
在Spring Boot 3.1.3中使用log4j-core实现日志功能,用application.properties配置时能正常生成错误日志,但切换到log4j2.xml配置后,errorlogs和generallogs目录下均无日志生成。需求是生成两个独立日志文件,分别存储错误日志和普通日志,相关配置及依赖如下:
application.properties配置
# Set the logging level for Spring Framework to ERROR logging.level.com.crystalbi.push_notifications = INFO # Define the log file location and log pattern logging.file.name = errorlogs/error-logs.log logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n logging.logback.rollingpolicy.max-file-size = 1GB
log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <!-- General Logs Appender --> <RollingFile name="GeneralLog" fileName="generalLogs/app.log" filePattern="generalLogs/app-%d{yyyy-MM-dd}-%i.log"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> </RollingFile> <!-- Error Logs Appender --> <RollingFile name="ErrorLog" fileName="errorlogs/error.log" filePattern="errorlogs/error-%d{yyyy-MM-dd}-%i.log"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <Filters> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> <Console name="LogToConsole" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Logger name="com.mkyong" level="INFO" additivity="false"> <AppenderRef ref="GeneralLog"/> <AppenderRef ref="LogToConsole"/> </Logger> <Logger name="org.springframework.boot" level="ERROR" additivity="false"> <AppenderRef ref="ErrorLog"/> <AppenderRef ref="LogToConsole"/> </Logger> <Root level="ERROR"> <AppenderRef ref="GeneralLog"/> <AppenderRef ref="ErrorLog"/> <AppenderRef ref="LogToConsole"/> </Root> </Loggers> </Configuration>
Maven依赖
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency>
问题分析与解决方案
核心问题
- 依赖不完整:Spring Boot默认使用Logback,仅引入
log4j-core无法完成日志框架替换,缺少Spring Boot与Log4j2的集成依赖,且未排除Logback。 - Logger名称不匹配:配置中
Logger的name为com.mkyong,与业务代码包com.crystalbi.push_notifications不符,导致业务日志无法被捕获。 - Root Logger级别限制:Root级别设为
ERROR,INFO级别的普通日志无法进入GeneralLog。 - RollingFile无滚动策略:仅定义
filePattern但未设置触发条件,可能导致日志无法正常写入。
修正步骤
1. 调整Maven依赖
排除Logback,引入Spring Boot Log4j2集成包:
<dependencies> <!-- 排除默认Logback依赖 --> <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> <!-- 引入Log4j2集成依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies>
2. 修正log4j2.xml配置
匹配业务包、调整日志级别、添加滚动策略:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <!-- 普通日志:捕获INFO及以上,排除ERROR --> <RollingFile name="GeneralLog" fileName="generalLogs/app.log" filePattern="generalLogs/app-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <!-- 1GB滚动策略 --> <SizeBasedTriggeringPolicy size="1GB"/> <!-- 保留最多10个滚动文件 --> <DefaultRolloverStrategy max="10"/> <Filters> <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> <!-- 错误日志:仅捕获ERROR及以上 --> <RollingFile name="ErrorLog" fileName="errorlogs/error.log" filePattern="errorlogs/error-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <SizeBasedTriggeringPolicy size="1GB"/> <DefaultRolloverStrategy max="10"/> <Filters> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> <Console name="LogToConsole" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <!-- 业务包日志配置 --> <Logger name="com.crystalbi.push_notifications" level="INFO" additivity="false"> <AppenderRef ref="GeneralLog"/> <AppenderRef ref="LogToConsole"/> </Logger> <!-- Spring Boot错误日志 --> <Logger name="org.springframework.boot" level="ERROR" additivity="false"> <AppenderRef ref="ErrorLog"/> <AppenderRef ref="LogToConsole"/> </Logger> <!-- Root日志级别设为INFO,确保未匹配日志被处理 --> <Root level="INFO"> <AppenderRef ref="GeneralLog"/> <AppenderRef ref="ErrorLog"/> <AppenderRef ref="LogToConsole"/> </Root> </Loggers> </Configuration>
3. 清理application.properties日志配置
移除所有日志相关配置,避免与log4j2.xml冲突:
# 删除以下配置 # logging.level.com.crystalbi.push_notifications = INFO # logging.file.name = errorlogs/error-logs.log # logging.pattern.console=... # logging.pattern.file=... # logging.logback.rollingpolicy.max-file-size = 1GB
验证要点
- 确保
generalLogs和errorlogs目录存在(Log4j2会自动创建,手动创建更稳妥) - 业务代码中使用
org.apache.logging.log4j.Logger或Spring日志抽象org.slf4j.Logger均可 - 测试INFO、ERROR级日志输出,确认分别写入对应文件
内容的提问来源于stack exchange,提问作者user22410466
相关产品推荐
相关产品推荐

