2011-04-07 41 views
1

我很困惑,當我嘗試使用log4j登錄進程時,我不知道在哪裏放置記錄器。 現在我把記錄器放在servlet中,並聲明爲公共靜態,以便每個人都可以使用它。我的過濾器也使用記錄器。但我不確定這個servlet是否被破壞,記錄器是否也會被破壞?在servlets和過濾器中聲明log4j的位置?

根據我的理解,另一個問題是過濾器在servlet之前,並且在我創建servlet中的記錄器時,最初,過濾器不應該能夠使用記錄器,但是,因爲我讓過濾器日誌這個過程中,沒有像「記錄器不存在」的某種異常,爲什麼?

什麼是記錄器的最佳地點?如果它是靜態的,也就是說,多個類可以共享一個記錄器?我想將過濾器和servlet的日誌放在一起。

回答

2

爲每個班級創建一個private static final Logger。例如,編寫以下線在servlet類:

private static final Logger logger = Logger.getLogger(YourServletClassName.class); 

和以下中的過濾器類線:

private static final Logger logger = Logger.getLogger(YourFilterClassName.class); 

通知作爲getLogger()方法參數傳遞的不同的值。記錄器應該是private static,以便同一類的多個實例可以使用它。通過這種方式,您可以按級別控制應用程序的輸出。例如,如果要查看的所有輸出只有YourServletClassName的實例(儘管通常只創建一個Servlet類的實例,該實例可用於處理每個請求),但您可以在log4j中編寫以下行。屬性:

log4j.logger.your.package.YourServletClassName=TRACE 
log4j.logger.your.package.YourFilterClassName=OFF 

這樣,從YourServletClassName日誌都只會什麼都不會顯示,從YourFilterClassName。希望能幫助到你。

+0

事實上,這與其他「普通」Java類沒有區別。每班只有一個記錄器。 – BalusC 2011-04-07 20:08:55

0

你應該在每個類

static org.apache.log4j.Logger logger = Logger.getLogger(MyClass.class); 

這樣,你的日誌文件明確安排來定義一個單獨的記錄,你可以有正確的類別在配置文件中。