Log4j2 RollingFile配置后午夜未生成新日志文件问题排查
问题排查
你的配置存在以下4个核心问题,导致滚动策略失效:
- 依赖不完整/版本不匹配
仅引入了log4j-slf4j-impl这一SLF4J适配层依赖,缺失log4j-api、log4j-core核心依赖,若log4j-core版本低于2.5,还会不支持CronTriggeringPolicy特性,最终配置失效退化为普通文件输出。 - 缺少根配置标签
你贴出的log4j2.xml配置缺少外层<Configuration>根标签,属于非法的Log4j2配置文件,框架无法正常加载自定义配置,会使用默认配置输出日志。 - 存在非法配置字符
Console和RollingFile节点下的PatternLayout配置行末尾多了多余的-字符,会导致配置解析失败,后续滚动策略不会生效。 - 触发策略配置不完善
CronTriggeringPolicy默认evaluateOnStartup参数为false,若程序启动时间已经过了当日零点,不会主动触发上一周期的日志归档,长期运行时也可能出现调度触发异常。
解决方案
第一步:补全Maven依赖
保证三个核心依赖版本一致,且不低于2.5,推荐使用无安全漏洞的稳定版2.17.2:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.2</version> </dependency> </dependencies>
第二步:修正log4j2.xml配置
修正所有语法错误,优化滚动策略,推荐直接使用TimeBasedTriggeringPolicy实现按天滚动,无需手动编写cron表达式,稳定性更高:
<?xml version="1.0" encoding="UTF-8"?> <!-- status设为WARN可输出Log4j2自身运行日志,方便排查配置问题 --> <Configuration status="WARN"> <Properties> <Property name="baseDir">logs</Property> <!-- 修正原拼写错误patter→pattern --> <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}/app.log" filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz"> <PatternLayout pattern="${patternLayout}"/> <!-- 按天滚动配置:自动识别filePattern中%d的时间粒度为天,每日零点自动滚动 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <DefaultRolloverStrategy> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz"/> <IfLastModified age="60d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="trace"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
如果要保留cron触发方案,将<TimeBasedTriggeringPolicy>替换为以下配置即可:
<CronTriggeringPolicy schedule="0 0 0 * * ?" evaluateOnStartup="true"/>
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

