Log4j2配置RollingFile未按天生成独立日志文件问题求助
问题解决方案
根因分析
日志不按天滚动的问题,通常由以下几个原因导致:
- 依赖缺失:仅引入
log4j-slf4j-impl不足以支撑log4j2的全部滚动功能,缺少核心依赖log4j-api、log4j-core,或三者版本不匹配 - 配置拼写错误:原配置中
patternLayout拼写为patterLayout,导致日志格式加载异常,可能影响滚动逻辑 - 滚动策略配置问题:Cron触发策略的参数未配置完整,或启动时检查逻辑未生效
- 目录权限不足:日志目录没有创建子目录的权限,导致滚动时生成归档文件失败
- 日志级别配置过高:
Configuration的status设为WARN,无法看到滚动过程中的具体报错信息
具体修复步骤
1. 补全pom.xml依赖
确保log4j2相关依赖版本统一,推荐使用2.17及以上的稳定版本避免安全漏洞:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.20.0</version> </dependency> </dependencies>
2. 优化log4j2.xml配置
按天滚动更推荐使用TimeBasedTriggeringPolicy,配置更简单不易出错:
<?xml version="1.0" encoding="UTF-8"?> <!-- 把status改成DEBUG,方便排查滚动报错,没问题后可以改回WARN --> <Configuration package="log4j.test" status="DEBUG"> <Properties> <Property name="baseDir">logs</Property> <Property name="patternLayout">%d{[dd.MM.yyyy HH:mm:ss.SSS]} %l %p:%n %m%n</Property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="${patternLayout}"/> </Console> <RollingFile name="RollingFile" fileName="${baseDir}/trace.log" filePattern="${baseDir}/$${date:yyyy-MM}/trace-%d{yyyy-MM-dd}.log.gz"> <PatternLayout pattern="${patternLayout}"/> <!-- interval=1 配合filePattern的日期精度%d{yyyy-MM-dd},就是1天滚动一次 --> <!-- modulate=true 对齐零点触发滚动 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <DefaultRolloverStrategy> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/trace-*.log.gz"/> <IfLastModified age="60d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="trace"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Root> <Logger name="org.apache.poi" level="error" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Logger> <Logger name="org.apache.xmlbeans" level="error" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Logger> </Loggers> </Configuration>
如果坚持使用Cron触发,给策略加上onStartup="true"参数,确保应用启动时先检查是否需要滚动:
<CronTriggeringPolicy schedule="0 0 0 * * ?" onStartup="true"/>
3. 检查目录权限
确保运行Java应用的操作系统用户,对项目下的logs目录拥有读写、创建子目录的权限。
验证方法
修改配置后启动应用,主动调整系统时间到次日零点(或等待跨天),观察logs目录下是否生成对应日期的归档压缩日志文件,新写入的日志是否只出现在当前的trace.log中即可。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

