让我先简要解释一下我正在使用的系统:
我们有一个作为守护进程运行的系统,在工作单元进入时运行它们。当这个守护进程被赋予一个新的工作单元时,它会动态地创建一个新线程。对于这些工作单元中的每一个,我需要 Log4J 创建一个新的日志文件以附加到 - 文件名将在运行时提供,此时必须创建新的日志文件。这个守护进程必须能够无限期地保持活动状态,我相信这会引起一些内存问题,我将解释。
我的第一个想法是为每个工作单元创建一个新的 Logger,当然,以线程命名。工作单元的线程保留对该 Logger 的引用。当单元完成时,它将被垃圾收集,但问题是 Log4J 本身保留了对 Logger 的引用,它将永远不会被再次使用。似乎所有这些 Logger 都会导致 VM 内存不足。
另一种解决方案:子类Filter,通过线程名称过滤Appender,并将它们放在同一个Logger上。然后,在工作单元完成时移除 Appender。当然,这需要添加代码以删除附加程序。那将是很多代码更改。
我研究了 NDC 和 MDC,它们似乎是为了管理交错输出到同一个文件。我考虑过提出这个作为解决方案,但我认为它不会被接受。
我想说 Log4J 似乎不打算以这种方式运行,即在运行时动态创建新的日志文件,因为它们是必需的(或期望的)。所以我不确定接下来要看哪个方向 - log4j 不是这里的解决方案,还是我完全错过了什么?我对 NDC 的关注不够仔细吗?还是因为我看不到的原因,我对 Log4J 持有 Loggers 的担忧不是问题?