簡體   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