You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:10:39