2011-02-27 55 views
5

我有一個應用程序與多個「控制器」,我想每個日誌到他們自己的文件。這對於他們自己的代碼來說很簡單,但我也使用了一些使用公共日誌記錄的庫代碼。我能以某種方式獲取該代碼以便登錄到特定於控制器的文件嗎?根據線程登錄到不同的文件

我想我能以某種方式通過螺紋做到這一點:

class Controller { 

public void action() { 
    setCurrentThreadLogFile(myLogFile); 
    try { 
    Library.stuff(); 
    } finally { 
    restoreCurrentThreadLogFile(); 
    } 
} 

} 

目前我使用共享記錄我自己的日誌,以及與log4j的作爲後端。但是如果需要的話,我可以改變它,或者使用混合(這在commons日誌框架中是可能的)。

我可以這樣做的一種方法是編寫我自己的commons日誌實現(可能是log4j的包裝),但是有沒有現有的解決方案?

+0

面向方面的編程會成爲您的選擇嗎?我認爲這可以優雅地解決你的問題。 – 2011-02-27 20:13:30

回答

2

您可能想要查看映射的診斷上下文(MDC)。 Commons日誌記錄不支持這些,但是Log4J可以,所以你必須直接去Log4J來設置它。您可能必須推出自己的過濾器才能使用MDC進行過濾並應用於appender。

如果您願意更改日誌記錄實現,那麼您可以使用SL4J作爲日誌記錄外觀和Logback作爲日誌記錄實現。讓控制器或某種過濾器/攔截器爲您要用來區分控制器的密鑰添加一個鑑別器值,其值爲MDC。使用SiftingAppender將日誌事件分成單獨的文件。

+0

我可以改變我自己的庫類型代碼來使用SLF4J,但是那些不在我的控制下的代碼使用commons logging? – 2011-02-27 22:32:50

+0

SLF4J支持傳統的API。它提供了使用API​​實現的公共日誌記錄的實現。你只需要用jcl-over-slf4j.jar替換commons logging jar。請參閱[鏈接](http://www.slf4j.org/legacy.html#jcl-over-slf4j)。 – Will 2011-02-28 09:38:09

+0

我不清楚。我知道SLF4J有一個公共日誌記錄適配器,但是它可以與MDC一起工作嗎?我的意思是,如果我在上下文中使用庫代碼,日誌輸出是否會以正確的文件結束? (儘管我不需要從庫代碼中編輯MDC)。 – 2011-02-28 19:22:56

1

每個線程的記錄器?把記錄器放入ThreadLocal。如果您使用的是java.util.logging,則Handler可能會使調用者看起來透明。

+0

如果必須編寫我自己的實現,ThreadLocal確實是一個我會用到的工具。但是我沒有使用java.util.logging,我無法在Tomcat中正確配置它。 – 2011-02-27 20:19:44

相關問題