Log4j2次日日志仍写入旧日期文件,需重启Tomcat才正常求助
Log4j2 日志日期不自动切换问题解决办法
这个问题我之前碰到过不少次,核心原因是你用的File Appender本身不支持按日期自动滚动日志文件——它只会在Tomcat启动时一次性解析文件名里的${date:yyyy-MM-dd}变量,生成当日的日志文件名。但日期切换后,它不会主动重新生成新文件名,导致后续日志依然写入前一天的文件,只有重启Tomcat才会重新解析变量。
先看你当前的配置:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <File name="CatalinaLog" fileName="${sys:catalina.base}/logs/catalina.${date:yyyy-MM-dd}.log" immediateFlush="true" append="true"> <PatternLayout pattern="[TID=%X{TId}] %d{MMM dd, yyyy HH:mm:ss,SSS} %c %M:%L %p: %m%n"/> </File> </Appenders> <Loggers> <Root level="DEBUG" > <AppenderRef ref="CatalinaLog" /> </Root> </Loggers> </Configuration>
解决方案
要实现无需重启Tomcat、每天自动切换日志文件的效果,你需要用RollingFileAppender替代File Appender,再配合时间触发的滚动策略(TimeBasedTriggeringPolicy)来完成。
修改后的完整配置如下:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 用RollingFileAppender替代原有的File Appender --> <RollingFile name="CatalinaLog" fileName="${sys:catalina.base}/logs/catalina.log" filePattern="${sys:catalina.base}/logs/catalina.%d{yyyy-MM-dd}.log"> <PatternLayout pattern="[TID=%X{TId}] %d{MMM dd, yyyy HH:mm:ss,SSS} %c %M:%L %p: %m%n"/> <!-- 配置按天滚动的策略 --> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <!-- 可选:保留最近30天的日志,自动清理旧日志 --> <DefaultRolloverStrategy max="30"/> </RollingFile> </Appenders> <Loggers> <Root level="DEBUG"> <AppenderRef ref="CatalinaLog"/> </Root> </Loggers> </Configuration>
关键配置说明
- RollingFileAppender:专门用于支持日志滚动的Appender,能根据配置的策略自动生成新的日志文件
- fileName:指定当前正在写入的实时日志文件名(比如
catalina.log) - filePattern:归档日志的文件名模板,
%d{yyyy-MM-dd}会自动替换为当日日期,生成类似catalina.2018-03-23.log的归档文件 - TimeBasedTriggeringPolicy:
interval="1":设置滚动周期为1个时间单位(这里因为filePattern用的是天级格式,所以代表每天滚动一次)modulate="true":把滚动时间调整到自然时间的整点(比如每天凌晨0点自动切换,而不是Tomcat启动后的24小时)
- DefaultRolloverStrategy:可选配置,设置保留的最大归档日志数量,超过后自动删除最旧的日志,避免磁盘被日志占满
这样配置后,每天凌晨日志会自动切换到新的日期命名文件,完全不用重启Tomcat就能解决你遇到的问题。
内容的提问来源于stack exchange,提问作者JackTheKnife
相关产品推荐
相关产品推荐

