1

以下是我的课程详情。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 进行日志记录。我有两个基于包名称的记录器。我正在打电话ClassEClassB来自ClassD。现在,comp1.log包含来自的日志消息ClassBcomp2.log包含来自ClassD和的日志ClassE

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

4

2 回答 2

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);
于 2012-08-16T09:45:06.310 回答
0

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

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

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

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

希望这可以帮助。

于 2012-08-16T10:03:06.980 回答