2012-08-16 85 views
1

下面是我的課程細節。 ClassA和ClassD是可運行的類。從ClassA我叫ClassB和ClassC。如何使用Log4j創建基於進程的日誌文件?

package comp1 -> Contains ClassA, ClassB, ClassC 
package comp2 -> Contains ClassD, ClassE 

Log for comp1 -> comp1.log 
Log for comp2 -> comp2.log 

我正在使用Log4j進行日誌記錄。我有兩個基於軟件包名稱的記錄器。我打電話給ClassEClassBClassD。現在,comp1.log包含來自ClassB的日誌消息和comp2.log包含來自ClassDClassE的日誌。

如何創建基於進程的日誌?如果我運行ClassD,那麼應該只有一個日誌文件ClassD,ClassEClassB。這可能使用Log4j嗎?

+0

你能解釋一下,這裏的runnable類是什麼,你的上下文中有什麼過程,並且有沒有從另一個類派生的類? – Less 2012-08-16 09:42:06

回答

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); 
0

有很多方法可以做到這一點,我個人將儀器與額外信息的日誌,然後使用日誌處理,向他們送出再次分裂了。如果你是基於Linux的話,這應該很容易,並且將額外的處理轉移到讀取時間而不是寫入時間。

方式來添加額外的信息是: -

  • 爲每個進程命名線程池,然後包括在您的模式
  • NDC添加上下文特定的信息(這是我使用)

另一種方法是使用具有特定名稱(ProcessA,ProcessB)的構造函數初始化的單獨記錄器。當你實例化你的依賴關係時,你可以傳入備用記錄器名稱以在構造函數中使用或通過屬性注入。如果你使用的是Spring,這很容易,如果不是,那麼我期望工廠模式是你的朋友。

希望這會有所幫助。