如何使用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
调用ClassE
和ClassB
。 现在, comp1.log
包含来自ClassB
日志消息, comp1.log
包含来自ClassD
和ClassE
日志。
如何制作基于流程的日志? 如果我运行ClassD
那么ClassD
, ClassE
和ClassB
只应该有一个日志文件。 这可能使用Log4j吗?
一种解决方案可以是使用系统变量。 你可以在log4j.xml中写这样的东西
重要的是使用系统变量$ {myProcId}
例如,在初始化Log4j之前,您可以提供系统变量
System.setProperty("myProcId", procId); DOMConfigurator.configure(log4jFilePath);
有很多方法可以做到这一点,我个人会使用额外的信息来检测日志,然后使用日志处理将它们再次拆分。 如果您是基于Linux的,那么这应该非常简单,并将额外的处理转移到读取时间而不是写入时间。
添加额外信息的方法是: –
- 然后,每个进程的命名线程池都包含在您的模式中
- NDC添加上下文特定信息(这是我使用的)
另一种方法是使用由具有特定名称(ProcessA,ProcessB)的构造函数初始化的单独记录器。 实例化依赖关系时,可以传入备用记录器名称以在构造函数中使用或通过属性注入。 如果您使用的是Spring,这将很容易,如果没有,那么我希望工厂模式是您的朋友。
希望这可以帮助。