2012-08-07 104 views
1

我想用Log4J記錄我的Java項目。 我創建的src目錄下一個log4j.properties文件,內容如下:不同類別的Log4J記錄器

# Root logger option 
log4j.rootLogger=INFO, file, stdout 
log4j.logger.DEFAULT_LOGGER=INFO,file2 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.FileAppender 
log4j.appender.file.File=file.log 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 



# Direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 


log4j.appender.file2=org.apache.log4j.FileAppender 
log4j.appender.file2.File=file2.log 
log4j.appender.file2.layout=org.apache.log4j.PatternLayout 
log4j.appender.file2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 

例如,我只想在我的主要方法使用「DEFAULT_LOGGER」。所以我寫了:

static Logger log = Logger.getLogger("DEFAULT_LOGGER"); 
log.fatal("Process Logger"); 

但是,當我執行的主要方法我打印消息「過程記錄器」所有的Appender(標準輸出,文件和文件2),但我只是想打印出來,以文件2。我該怎麼做或者更好地說我做錯了什麼?

第二點是,當我第二次執行主要方法時,它不會覆蓋文件和文件2,它只是在文本文件中添加一行。我怎樣才能避免這種情況?

回答

3

Log4j有一些東西叫additivity。默認情況下它被設置爲true,這意味着你所寫的每個日誌不僅會被特定的日誌記錄器記錄,而且還會被其祖先(本例中的根記錄器)記錄下來。

要將其設置爲false試試這個:

log4j.additivity.DEFAULT_LOGGER = false 

瞭解更多關於它here

+0

謝謝。現在它的工作原理是輸出僅存儲在file2中,而不存儲在stdout中。 但還剩2件事。當我啓動主要方法時,它仍然創建file和file2。文件是空的,輸出只寫入file2,但我不希望文件被創建。這是如何工作的? 還有一個問題,即當我執行該方法2次時,log4j不會覆蓋file2,它只是將輸出添加到文件中。 – Metalhead89 2012-08-07 09:11:21

+0

Log4j在開始處掃描屬性文件並創建所有附加到記錄器定義所需的文件。所以如果你不想創建文件,從記錄器中刪除appender:'log4j.rootLogger = INFO,file,stdout',make it:'log4j.rootLogger = INFO,stdout' – Tomer 2012-08-07 09:13:59

+0

你爲什麼想要文件被覆蓋?這基本上擊敗日誌記錄的目的... – Tomer 2012-08-07 09:16:24

1

嘗試:

log4j.additivity.DEFAULT_LOGGER = false