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

Log4j2动态日志文件名的Size触发滚动策略失效问题排查

问题分析

当前配置中基于大小的滚动功能失效,核心原因是**fileName里的${date:dd-MM-yyyy}是动态解析变量**——Log4j2会在每次写入日志时重新计算当前日期,导致RollingFileAppender无法持续跟踪同一个活跃文件的大小,自然无法触发大小阈值的滚动逻辑。

解决方案

要让按大小滚动正常工作,需要让活跃日志文件名中的日期部分在应用启动时就固定下来(而非动态变化),同时保留PID和大小滚动、文件数量限制的逻辑。

修正后的完整配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LOG_PATTERN">
            %-40.40c{1.} : %notEmpty{%m}%n%ex
        </Property>
        <Property name="PID">${sys:PID}</Property>
        <Property name="FS">${sys:file.separator}</Property>
        <Property name="log-path">log${sys:file.separator}</Property>
        <Property name="log-pattern">%d{yyyy-MM-dd HH:mm:ss,SSS} PID:${sys:PID} %-2p [T@%tid-%t] [%F:%L] %notEmpty{%marker} %m%n</Property>
        <!-- 启动时固定解析日期,避免动态变化 -->
        <Property name="START_DATE">${date:dd-MM-yyyy}</Property>
    </Properties>

    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${sys:logName}">
                <Route key="testlog">
                    <RollingFile name="ArchiveLog" 
                                 fileName="${log-path}logname.${PID}.${START_DATE}.log"
                                 filePattern="${log-path}logname.${PID}.${START_DATE}.%i.log">
                        <PatternLayout pattern="${log-pattern}"/>
                        <Policies>
                            <SizeBasedTriggeringPolicy size="10MB"/>
                        </Policies>
                        <!-- 限制最多保留10个旧日志文件 -->
                        <DefaultRolloverStrategy max="10"/>
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Logger name="logname" level="trace" additivity="false">
            <AppenderRef ref="Routing" />
        </Logger>
        <Root level="info">
            <AppenderRef ref="Routing"/>
        </Root>
    </Loggers>
</Configuration>

关键修改点

  1. 静态日期变量:新增START_DATE属性,在配置加载时就解析为启动当天的日期,后续不再变化,确保活跃日志文件名固定。
  2. 固定文件名:fileName使用静态的${START_DATE}替代动态的${date:dd-MM-yyyy},让RollingFileAppender能持续跟踪同一个文件的大小。
  3. 保留原有规则:保持SizeBasedTriggeringPolicy(10MB滚动)和DefaultRolloverStrategy(最多10个旧文件)的配置,满足你的核心需求。

扩展:跨天自动切换日志文件

如果需要应用跨天运行时自动生成带当天日期的新活跃文件,可同时添加按天滚动策略,并使用DirectWriteRolloverStrategy避免动态文件名导致的大小滚动失效:

<RollingFile name="ArchiveLog" 
             fileName="${log-path}logname.${PID}.${date:dd-MM-yyyy}.log"
             filePattern="${log-path}logname.${PID}.%d{dd-MM-yyyy}.%i.log">
    <PatternLayout pattern="${log-pattern}"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10MB"/>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
    </Policies>
    <DirectWriteRolloverStrategy maxFiles="10"/>
</RollingFile>

内容的提问来源于stack exchange,提问作者gal kar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:31:01