Log4j2:当前日期追加写入文件功能失效问题求助
解决Log4j2按当日日期追加写入Catalina日志的问题
你的配置之所以没实现需求,是因为当前设置是先写入固定名称的catalina.log,等到每日触发滚动时才把它重命名为带日期的文件——这和你想要的「直接将当日日志写入对应日期的文件并持续追加」不符。
下面是调整后的配置,完全满足你的需求:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <RollingFile name="CATALINA" fileName="${sys:catalina.base}/logs/catalina.%d{yyyy-MM-dd}.log" filePattern="${sys:catalina.base}/logs/catalina.%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="[TID=%tid] %d %-5p %c- %m%n"/> <!-- 每日午夜触发日志文件切换 --> <TimeBasedTriggeringPolicy modulate="true" interval="1"/> <!-- 可选:如果需要限制单文件大小,取消下面的注释(示例为100MB) --> <!-- <SizeBasedTriggeringPolicy size="100MB"/> --> <!-- 核心配置:直接写入带日期的文件,跳过中间的固定名称文件 --> <DirectWriteRolloverStrategy> <FileNamePattern>${sys:catalina.base}/logs/catalina.%d{yyyy-MM-dd}-%i.log</FileNamePattern> </DirectWriteRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="CATALINA"/> </Root> </Loggers> </Configuration>
关键配置说明:
fileName:用%d{yyyy-MM-dd}动态生成当日日期的文件名,结合后续策略,当天所有日志都会追加到这个文件里。TimeBasedTriggeringPolicy:interval=1表示每天触发一次文件切换,modulate=true确保切换发生在午夜(而不是应用启动后的24小时),完美贴合自然日的时间节点。DirectWriteRolloverStrategy:这是实现需求的核心,它让Log4j2直接写入带日期的目标文件,不需要先写临时的catalina.log再重命名,完全符合你「按当日日期追加写入」的要求。- 可选的大小限制:如果担心单个日期的日志文件过大,可以启用
SizeBasedTriggeringPolicy,当文件超过指定大小后,会自动生成带索引的文件(比如catalina.2024-05-20-1.log)继续写入。
注意事项:
- 确保你的Log4j2版本在2.8及以上,
DirectWriteRolloverStrategy是从这个版本开始引入的。 - 验证
${sys:catalina.base}系统变量指向的路径正确,且应用有该目录的写入权限。
内容的提问来源于stack exchange,提问作者JackTheKnife
相关产品推荐
相关产品推荐

