gpt4 book ai didi

java - Log4J - 在动态创建线程的环境中,每个线程一个日志文件

转载 作者:行者123 更新时间:2023-12-01 05:04:27 24 4
gpt4 key购买 nike

让我首先简要介绍一下我正在使用的系统:

我们有一个作为守护进程运行的系统,在工作单元进来时运行它们。当给定一个新的工作单元时,该守护进程会动态创建一个新线程。对于每个工作单元,我需要 Log4J 创建一个新的日志文件以附加到 - 文件名将在运行时提供,此时必须创建新的日志文件。这个守护进程必须能够无限期地保持 Activity 状态,我相信这会导致一些内存问题,正如我将解释的那样。

我的第一个想法是为每个工作单元创建一个新的记录器,当然,以线程命名。工作单元的线程保留对该记录器的引用。当单元完成时,它将被垃圾收集,但问题是Log4J本身保留了对Logger的引用,该引用永远不会被再次使用。看来所有这些记录器都会导致虚拟机内存不足。

另一个解决方案:子类Filter,通过线程名称过滤Appender,并将它们放在同一个Logger上。然后,在工作单元完成后删除 Appender。当然,这需要添加代码来删除附加程序。这将需要进行大量代码更改。

我研究了 NDC 和 MDC,它们似乎旨在管理同一文件的交错输出。我考虑过提出这个作为解决方案,但我认为它不会被接受。

我想说的是,Log4J 似乎不打算以这种方式运行,即在运行时根据需要(或期望)动态创建新的日志文件。所以我不确定下一步该往哪个方向看 - log4j 不是这里的解决方案,还是我完全错过了一些东西?我对 NDC 的研究还不够仔细吗?或者我对 Log4J 保留记录器的担忧是否不是问题,因为我看不到什么原因?

最佳答案

您可以创建一个新的日志方法来包装普通的日志方法,并附加线程 ID。类似下面的内容(过于简单,但你明白了)。我相信 Log4j 已经是线程保存的了,所以只要你不记录大量日志,就应该没问题。然后你可以轻松地 grep 线程 id。

public log(long id, String message)
{
logger.log("ThreadId: id + "message: " + message);
}

关于java - Log4J - 在动态创建线程的环境中,每个线程一个日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924015/

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