1

让我先简要解释一下我正在使用的系统:

我们有一个作为守护进程运行的系统,在工作单元进入时运行它们。当这个守护进程被赋予一个新的工作单元时,它会动态地创建一个新线程。对于这些工作单元中的每一个,我需要 Log4J 创建一个新的日志文件以附加到 - 文件名将在运行时提供,此时必须创建新的日志文件。这个守护进程必须能够无限期地保持活动状态,我相信这会引起一些内存问题,我将解释。

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

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

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

我想说 Log4J 似乎打算以这种方式运行,即在运行时动态创建新的日志文件,因为它们是必需的(或期望的)。所以我不确定接下来要看哪个方向 - log4j 不是这里的解决方案,还是我完全错过了什么?我对 NDC 的关注不够仔细吗?还是因为我看不到的原因,我对 Log4J 持有 Loggers 的担忧不是问题?

4

2 回答 2

0

ThreadLocal 似乎是您的解决方案。

于 2013-11-27T15:57:53.280 回答
0

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

public log(long id, String message)
{
   logger.log("ThreadId: id + "message: " + message);
}
于 2012-10-16T21:59:13.920 回答