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

时间:2012-08-16 09:35:32

标签: java 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进行日志记录。我有两个基于包名称的记录器。我从ClassE致电ClassBClassD。现在,comp1.log包含来自ClassBcomp2.log的日志消息,其中包含来自ClassDClassE的日志。

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

2 个答案:

答案 0 :(得分:1)

一种解决方案可能是使用系统变量。 您可以在log4j.xml

中编写类似的内容
<appender name="ProductionLog" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="c:/logs/myLog-${myProcId}.log"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="10000KB"/>
    <param name="MaxBackupIndex" value="10"/>
    <layout class="org.apache.log4j.EnhancedPatternLayout">
        <param name="ConversionPattern" value="[%d] [%-5p] {%c|%t}: %m%n"/>
    </layout>
</appender>

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

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

答案 1 :(得分:0)

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

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

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

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

希望这有帮助。