Log4j2 XML配置下旧日志删除功能失效问题求助
Log4j2 旧日志无法自动删除的问题排查与修复
核心问题与修复方案
未定义
${baseDir}系统属性
配置中Delete节点的basePath使用了未声明的${baseDir}变量,而日志实际存储在应用根目录。如果该变量未通过启动参数赋值,Log4j2无法定位日志目录,删除逻辑完全不会执行。
修复:直接将basePath改为应用根目录标识,比如${sys:user.dir}(当前工作目录)或.,也可在启动时添加-DbaseDir=.参数。文件名匹配规则不安全且不精准
IfFileName glob="*"会匹配目录下所有文件,存在误删非日志文件的风险,同时会降低扫描效率。应匹配你的日志文件命名模式,确保只处理目标日志。
修复:将glob规则改为${sys:log_name}-*.log,精准匹配滚动生成的日志文件。删除逻辑触发时机缺失
Delete操作仅在日志滚动(rollover)发生时执行,当前仅配置了文件大小和启动时的滚动触发策略。若一天内日志未达到2000KB且未重启应用,滚动不会触发,删除逻辑也不会运行。
修复:添加TimeBasedTriggeringPolicy,强制每天至少触发一次滚动:<TimeBasedTriggeringPolicy interval="1" modulate="true"/>滚动策略参数冲突
DefaultRolloverStrategy的max="5"设置了保留的滚动文件数量,与时间删除规则同时生效时会取更严格的条件。若优先按时间删除,可适当调大max值(如10),避免数量限制提前拦截时间规则。
修改后的完整配置示例
<Configuration> <Appenders> <RollingFile name="allLogsFile" fileName="${sys:log_name}" filePattern="${sys:log_name}-%d{MM-dd-yyyy}-%i.log"> <PatternLayout pattern="%d{DATE} %-10X{session} %-8X{user} %5p %c{1}:%L - %m%n" /> <Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size="2000KB" /> <!-- 新增时间触发策略,每天自动滚动一次 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <DefaultRolloverStrategy max="10"> <!-- 使用当前工作目录作为扫描路径,精准匹配日志文件 --> <Delete basePath="${sys:user.dir}" maxDepth="1"> <IfFileName glob="${sys:log_name}-*.log" /> <IfLastModified age="P1D" /> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Logger name="com.test.*" additivity="false" level="debug"> <AppenderRef ref="allLogsFile" /> </Logger> <Root level="debug"> <AppenderRef ref="allLogsFile" /> </Root> </Loggers> </Configuration>
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

