gpt4 book ai didi

java - 关闭动态创建的 Log4j 2 appender

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:27 26 4
gpt4 key购买 nike

我正在使用 Routing Log4j 2 中用于在运行时动态创建附加程序的功能。当我知道这些 appender 已完成时,我想告诉 Log4j 以便它可以整理相关资源(刷新并关闭文件、释放与这些 appender 相关的内部对象等)。如果不这样做,Log4j 仍然有打开的文件句柄,我无法操作它写入的文件(来自对日志进行后处理和存档的外部进程)。

我如何告诉 Log4j 不再使用附加程序?

为了完整性,我包含了我的 Log4j 配置。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>

<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %level{ERROR=!, WARN=?, INFO=-, DEBUG=., TRACE=.} %msg%n"/>
</Console>

<Routing name="MatchLogs">
<Routes pattern="$${ctx:matchID}">
<Route>
<RandomAccessFile name="MatchLog-${ctx:matchID}" fileName="logs/${ctx:matchID}.log">
<PatternLayout pattern="%d{ISO8601} %-5level %-30.30logger{1} %msg%n"/>
</RandomAccessFile>
</Route>
</Routes>
</Routing>
<Async name="AsyncWrapper">
<AppenderRef ref="MatchLogs" level="debug"/>
<AppenderRef ref="Console" level = "info"/>
</Async>

<Routing name="MatchStatsLogs">
<Routes pattern="$${ctx:matchID}">
<Route>
<RandomAccessFile name="MatchStatsLog-${ctx:matchID}" fileName="logs/${ctx:matchID}_stats.log">
<PatternLayout pattern="%msg"/>
</RandomAccessFile>
</Route>
</Routes>
</Routing>
<Async name="AsyncStatsWrapper">
<AppenderRef ref="MatchStatsLogs" level="debug"/>
</Async>

</Appenders>


<Loggers>
<Logger name="stats" level="trace" additivity="false">
<AppenderRef ref="AsyncStatsWrapper"/>
</Logger>
<Root level="debug">
<AppenderRef ref="AsyncWrapper"/>
</Root>
</Loggers>


</Configuration>

当比赛开始时,我从参与该比赛的每个线程调用 ThreadContext.put("matchID", theMatchID);。匹配完成后,我清除 ThreadContext。显然,这不足以让 Log4j 知道我不会重新使用该匹配 ID,因此它保留了 Appender。但是,我知道我不会重复使用匹配 ID,那么我该如何告诉 Log4j 进行整理?

最佳答案

Log4J 还没有提供那个功能。您可能希望在 Log4J2 问题跟踪器 (https://issues.apache.org/jira/browse/LOG4J2) 中提出功能请求。

关于java - 关闭动态创建的 Log4j 2 appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com