Log4j2 删除策略不生效问题排查求助
Log4j2 删除策略不生效问题
我们的应用根据app.name和entity.name生成日志,但Log4j2的日志删除策略始终未生效。
应用启动参数
app1
-Dapp.name=books -Dentity.name=The_Little_Prince
app2
-Dapp.name=sports -Dentity.name=Badminton
现有Log4j2配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration monitorInterval="1" packages=""> <Properties> <property name="baseDir">/apps/log/${sys:app.name}</property> <Property name="filename">${sys:entity.name}</Property> <Property name="loglevel">ERROR</Property> </Properties> <Appenders> <Console name="console" target="SYSTEM_OUT"> </Console> <RollingRandomAccessFile name="App-File-Appender" fileName="${baseDir}/${filename}.log" filePattern="${baseDir}/${filename}-%d{yyyy-MM-dd}.%i.log.gz"> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="250 MB" /> </Policies> <DefaultRolloverStrategy > <Delete basePath="${baseDir}/" maxDepth="1" > <IfFileName glob="${filename}-*.log.gz" /> <IfLastModified age="7d"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> </Appenders> <Loggers> <!-- 按包设置日志级别为可选配置 --> <!-- 可选配置开始 --> <logger name="org.springframework" level="${loglevel}" /> <logger name="org.apache" level="${loglevel}" /> <logger name="org.eclipse" level="${loglevel}" /> <logger name="sun.net" level="${loglevel}" /> <!-- 可选配置结束 --> <Root level="${loglevel}" additivity="false"> <AppenderRef ref="App-File-Appender" /> <AppenderRef ref="console" /> </Root> </Loggers> </Configuration>
使用环境
Java 1.8, Spring Boot 2.7.6, Log4j 2.17.1
问题排查与修复方案
1. 修正变量解析逻辑
Log4j2初始化时会提前解析DefaultRolloverStrategy中的变量,若使用${filename}可能因Spring Boot系统变量加载延迟,导致匹配的是变量名而非实际实体名称。直接引用系统属性即可解决:
<IfFileName glob="${sys:entity.name}-*.log.gz" />
2. 修复路径格式问题
basePath="${baseDir}/"会生成多余斜杠(如/apps/log/books//),导致路径匹配失败,修改为:
<Delete basePath="${baseDir}" maxDepth="1" >
3. 补充辅助删除条件(可选)
添加文件数量限制,避免时间判断异常导致的删除失效:
<Delete basePath="${baseDir}" maxDepth="1" > <IfFileName glob="${sys:entity.name}-*.log.gz" /> <IfLastModified age="7d"/> <IfAccumulatedFileCount exceeds="10" /> <!-- 可根据实际需求调整数值 --> </Delete>
4. 开启调试日志验证
添加启动参数-Dlog4j2.debug=true,查看Log4j2滚动策略和删除操作的详细日志,确认是否存在路径匹配错误、权限不足等问题。
5. 验证目录权限
确保应用进程对${baseDir}目录拥有读写权限,否则删除操作会静默执行失败。
内容的提问来源于stack exchange,提问作者Vasanth
相关产品推荐
相关产品推荐

