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>
关键修改点
- 静态日期变量:新增
START_DATE属性,在配置加载时就解析为启动当天的日期,后续不再变化,确保活跃日志文件名固定。 - 固定文件名:
fileName使用静态的${START_DATE}替代动态的${date:dd-MM-yyyy},让RollingFileAppender能持续跟踪同一个文件的大小。 - 保留原有规则:保持
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
相关产品推荐
相关产品推荐

