如何配置Log4j2实现定时启动Java应用的日志按日期滚动?
嘿,针对你的这个日志滚动需求,结合你应用是cron启动的独立JVM场景,我给你整理了Log4j 2.11的具体配置方案,完全匹配你的要求:
核心思路
因为你的应用不是持续运行的Tomcat这类环境,而是每次cron触发时启动新JVM、运行几分钟就结束,所以常规的时间滚动策略需要配合启动时检查滚动的逻辑——既要保证当天结束时(如果JVM刚好跨午夜运行)自动滚动,也要保证新一天首次启动应用时,自动把前一天的日志归档压缩。
我们可以通过Log4j 2的TimeBasedTriggeringPolicy + OnStartupTriggeringPolicy组合来实现这个需求。
完整配置示例(log4j2.xml)
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN" name="AppLogConfig"> <Appenders> <!-- 配置滚动文件Appender --> <RollingFile name="RollingFileAppender" fileName="rolling.log" filePattern="rolling-%d{yyyy-MM-dd}.log.gz"> <!-- 日志格式,可根据你的需求调整 --> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <!-- 滚动触发策略 --> <Policies> <!-- 基于时间滚动:每天1次,对齐到午夜 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 启动时触发滚动:只要当前日期与日志文件最后修改日期不同,就触发归档 --> <OnStartupTriggeringPolicy minSize="0"/> </Policies> <!-- 滚动策略:保留最近30天的日志,可按需调整 --> <DefaultRolloverStrategy max="30"/> </RollingFile> </Appenders> <Loggers> <!-- 替换成你需要配置的特定日志器名称 --> <Logger name="com.your.app.target.Logger" level="info" additivity="false"> <AppenderRef ref="RollingFileAppender"/> </Logger> <!-- 根日志器,可根据需求调整级别 --> <Root level="warn"> <AppenderRef ref="RollingFileAppender"/> </Root> </Loggers> </Configuration>
关键配置解释
fileName="rolling.log":指定当前日志写入的实时文件filePattern="rolling-%d{yyyy-MM-dd}.log.gz":归档后的文件名格式,%d{yyyy-MM-dd}会自动替换为日志对应的日期,.gz后缀让Log4j自动将归档文件压缩为gzip格式TimeBasedTriggeringPolicy:设置每天滚动一次,modulate="true"确保滚动时间对齐到午夜(比如不管应用什么时候启动,第一次滚动都会在当天午夜),避免出现跨天的滚动时间偏差OnStartupTriggeringPolicy minSize="0":这是适配你cron场景的核心配置!它会在JVM启动时检查现有rolling.log的最后修改时间,如果不属于当前日期,就立即将其归档为对应日期的.log.gz文件,然后新建rolling.log写入当天的日志DefaultRolloverStrategy max="30":自动保留最近30天的归档日志,超过的会被自动清理,你可以根据存储需求调整这个数值
场景验证
- 同一天内多次启动应用:日志会继续写入现有的
rolling.log,不会触发滚动,符合你的需求 - 新一天首次启动应用:启动时会自动把前一天的
rolling.log归档为rolling-yyyy-MM-dd.log.gz,然后新建rolling.log写入当天日志 - 若应用跨午夜运行(比如cron触发后运行到第二天):
TimeBasedTriggeringPolicy会在午夜自动触发滚动,生成当天的归档文件
内容的提问来源于stack exchange,提问作者krallus
相关产品推荐
相关产品推荐

