【问题标题】:How to create process based log file using Log4j?如何使用 Log4j 创建基于进程的日志文件?
【发布时间】:2012-08-16 09:35:31
【问题描述】:

以下是我的课程详情。 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 的日志。

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

【问题讨论】:

  • 你能解释一下,这里的可运行类是什么,你的上下文中的进程是什么,是否有任何类派生自另一个类?

标签: java log4j


【解决方案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);

【讨论】:

    【解决方案2】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多