繁体   English   中英

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

[英]How to create process based log file using 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日志消息,而comp2.log包含来自ClassDClassE日志。

如何制作基于流程的日志? 如果我运行ClassDClassDClassEClassB应该只有一个日志文件。 使用Log4j是否可以?

一种解决方案是使用系统变量。 您可以在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);

有很多方法可以执行此操作,就我个人而言,我将为日志记录额外的信息,然后使用日志处理将其重新拆分。 如果您基于Linux,那么这应该非常容易,并将多余的处理转移到读取时间而不是写入时间上。

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

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

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM