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

Log4j2.xml变量关联、Purge配置及内存泄漏问题解决咨询

问题分析与修复方案

原配置存在两个核心问题引发内存泄漏:

  • Routes的pattern语法错误(多了一个闭合大括号),导致无法根据requestId正确区分日志实例
  • RollingFile Appender未关联requestId变量,IdlePurgePolicy无法识别空闲的请求专属日志实例,大量无用Appender持续堆积占用内存

修改后的Log4j2配置

<Appenders>
    <Routing name="Routing">
        <!-- 修正pattern语法错误,正确引用ThreadContext中的requestId变量 -->
        <Routes pattern="$${ctx:requestId}">
            <!-- 为每个requestId创建唯一的日志实例,关联变量到Appender名称和文件路径 -->
            <Route>
                <RollingFile name="childallog-${ctx:requestId}" 
                             append="true" 
                             fileName="logs/childallog-${ctx:requestId}.log" 
                             filePattern="logs/childallog-${ctx:requestId}-%i.%d{yyyy-MM-dd}.log">
                    <PatternLayout pattern="%d{DEFAULT} %-5p [%c] - %m%n"/>
                    <Policies>
                        <OnStartupTriggeringPolicy minSize="1" />
                        <SizeBasedTriggeringPolicy size="100MB" />
                    </Policies>
                    <DefaultRolloverStrategy max="3" fileIndex="min" />
                </RollingFile>
            </Route>
            <!-- 处理无requestId的请求,路由到默认日志实例 -->
            <Route key="$${ctx:requestId}" ref="DefaultRollingFile"/>
        </Routes>
        <!-- 自动清理1分钟未使用的空闲日志实例 -->
        <IdlePurgePolicy timeToLive="1" timeUnit="minutes"/>
    </Routing>

    <!-- 默认日志Appender,兜底无requestId的请求日志 -->
    <RollingFile name="DefaultRollingFile" 
                 append="true" 
                 fileName="logs/childallog-default.log" 
                 filePattern="logs/childallog-default-%i.%d{yyyy-MM-dd}.log">
        <PatternLayout pattern="%d{DEFAULT} %-5p [%c] - %m%n"/>
        <Policies>
            <OnStartupTriggeringPolicy minSize="1" />
            <SizeBasedTriggeringPolicy size="100MB" />
        </Policies>
        <DefaultRolloverStrategy max="3" fileIndex="min" />
    </RollingFile>
</Appenders>

<Loggers>
    <Logger name="AssemblyLine.AssemblyLines/childAL" level="info">
        <AppenderRef ref="Routing" />
    </Logger>
</Loggers>

关键修改说明

  • 修正语法错误:将原错误的$${ctx:requestId}}改为$${ctx:requestId},确保ThreadContext变量能被正确解析
  • 绑定requestId到日志实例:给RollingFile的名称、日志文件名添加-${ctx:requestId}后缀,让每个请求的日志实例拥有唯一标识,保证IdlePurgePolicy能精准识别并清理空闲实例
  • 添加默认路由:避免无requestId的请求创建无效日志实例,统一路由到默认Appender
  • IdlePurgePolicy生效:配置的1分钟存活时间会自动清理超过1分钟未被使用的请求专属日志Appender,从根源上避免内存堆积

代码层面配合要求

HTTP请求处理结束时,必须调用ThreadContext.remove("requestId")清除上下文变量,让IdlePurgePolicy能正确识别该请求对应的日志实例已进入空闲状态。

内容的提问来源于stack exchange,提问作者user3506319

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:20:21