You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:46:04