如何使用Log4j创建基于进程的日志文件?

以下是我的课程详情。 ClassA和ClassD是可运行的类。 从ClassA我调用ClassB和ClassC。

package comp1 -> Contains ClassA, ClassB, ClassC package comp2 -> Contains ClassD, ClassE Log for comp1 -> comp1.log Log for comp2 -> comp2.log 

我正在使用Log4j进行日志记录。 我有两个基于包名称的记录器。 我从ClassD调用ClassEClassB 。 现在, comp1.log包含来自ClassB日志消息, comp1.log包含来自ClassDClassE日志。

如何制作基于流程的日志? 如果我运行ClassD那么ClassDClassEClassB只应该有一个日志文件。 这可能使用Log4j吗?

一种解决方案可以是使用系统变量。 你可以在log4j.xml中写这样的东西

          

重要的是使用系统变量$ {myProcId}
例如,在初始化Log4j之前,您可以提供系统变量

 System.setProperty("myProcId", procId); DOMConfigurator.configure(log4jFilePath); 

有很多方法可以做到这一点,我个人会使用额外的信息来检测日志,然后使用日志处理将它们再次拆分。 如果您是基于Linux的,那么这应该非常简单,并将额外的处理转移到读取时间而不是写入时间。

添加额外信息的方法是: –

  • 然后,每个进程的命名线程池都包含在您的模式中
  • NDC添加上下文特定信息(这是我使用的)

另一种方法是使用由具有特定名称(ProcessA,ProcessB)的构造函数初始化的单独记录器。 实例化依赖关系时,可以传入备用记录器名称以在构造函数中使用或通过属性注入。 如果您使用的是Spring,这将很容易,如果没有,那么我希望工厂模式是您的朋友。

希望这可以帮助。