求助:Log4j2(2.3版本)覆盖前一日日志文件问题
解决Log4j2 2.3版本覆盖前一日日志的问题
嘿,我一眼就揪出问题所在了——你的RollingFile配置里,fileName和filePattern的命名规则完全重复了!
问题根源分析
你当前的配置中:
fileName设为${sys:catalina.base}/logs/catalina.${date:yyyy-MM-dd}.log,意味着Log4j2每天都会生成一个带当日日期的新日志文件;filePattern也用了一模一样的格式,当天结束触发滚动归档时,它会尝试把当前日志重命名为该格式的文件,但这个文件名已经被当日的日志占用了。到第二天生成新日志文件时,就会直接覆盖前一天的归档文件。
修正后的配置方案
核心思路是让实时写入的日志文件名和归档后的日志文件名完全区分开:
- 将
fileName改为固定名称(不带日期),作为当前正在写入的实时日志文件; - 保留
filePattern的日期格式,甚至可以添加压缩后缀节省磁盘空间。
完整修正后的配置示例:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <RollingFile name="RollingFile" fileName="${sys:catalina.base}/logs/catalina.log" filePattern="${sys:catalina.base}/logs/catalina.%d{yyyy-MM-dd}.log.gz"> <PatternLayout pattern="[TID=%X{TId}] %d{MMM dd, yyyy HH:mm:ss,SSS} %c %M:%L %p: %m%n"/> <TimeBasedTriggeringPolicy modulate="true" /> </RollingFile> </Appenders> <Loggers> <!-- 必须关联Appender才能生效,原配置缺失这部分 --> <Root level="info"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
额外说明
modulate="true"的配置没问题,它会让日志滚动触发时间对齐到整点(比如每天0点整切换新日志),而非从应用启动时间计算24小时;- 如果不需要压缩归档文件,去掉
filePattern里的.gz后缀即可; - 原配置缺少
<Loggers>部分,一定要加上Root Logger或自定义Logger关联RollingFile Appender,否则日志不会输出到目标文件。
内容的提问来源于stack exchange,提问作者JackTheKnife
相关产品推荐
相关产品推荐

