2012-11-29 13 views
40

Log4j'yi kullanarak birden çok günlük dosyasına yazarken yinelenen günlük iletileriyle ilgili sorun yaşıyorum. Şu andaLog4j: Çoklu günlükler, düzeyler ve ekleyiciler

benim foo.log dosyada filanca adlı spesifik kaydedicisi için (yukarı ve) INFO düzeyinde veri giriş yapmaya çalışıyorsanız ve am bar.log dosyada tüm kaydediciler için (yukarı ve) sonra tüm WARN seviye günlük mesajlarını . Bunun bir sonucu olarak

, yinelenen kayıt mesajları foo.log dosyaya yazılmış (her satır iki kez açmış oldu) ve bazı hızlı araştırma sonra ben öneri bu benim özellikleri dosya için log4j.additivity.foobar=false eklemek oldu düzeltmek için bulundu.

bu sorun, yinelenen satırları durur halde, filanca logger'dan WARN mesajı bar.log dosyaya yazılır asla olmasıdır.

şöyle My log4j özellikleri dosyasıdır:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO, FOO 
log4j.additivity.foobar = false 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 

herkes hala ben hem günlük dosyalarına günlük iletilerini yazabilirsiniz bilen (I additivity özelliğini ayarlayarak başlamadan önce o yapıyordu gibi) ve mu yinelenen günlük mesajları engellemek?

Lütfen dikkat, bu sorunun basitleştirilmiş bir özetidir. Gerçek dünya senaryosunda birden logger ve ikiden fazla günlük dosyaları bu sorun iki kısımda çözülebilir

cevap

54

vardır.

1. Önlemek mesajları

biz rootLogger ve log4j.logger.foobar kategorisinde hem FOO appender listelenen çünkü mesajlar iki kez yazıldığı günlük log çoğaltmak. Bu yüzden appender kaldırması gerekir ve sadece kategorisinde kaydı düzeyini tanımlayın:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

Bu log4j.logger.foobar den BİLGİ düzey mesajları kaydediciler appenders TÜM yukarı yayılır anlamına gelir rootLogger içinde, ancak her bir günlük dosyasına yalnızca bir kez yazılır.

2. Önlemek BİLGİ seviye mesajı log4j.logger.foobar kategori için INFO seviyesi günlük mesajlarının tüm yana

rootLogger yılında appenders miras ediliyor bar.log için yazılmaktadır INFO düzeyindeki mesajları kaydetmek için BAR ekleyiciyi durdurmamız gerekiyor.

Biz kendisi appender BAR üzerinde Eşik özelliğini ayarlayarak bunu başarabilirsiniz:

log4j.appender.BAR.Threshold = WARN 

Bu BİLGİ düzeyinde beyanlar bar.log dosyası olarak kaydediliyordu önleyecektir Sadece WARN seviyelerini ve yukarı doğru kabul eder. aşağıdaki gibi

Yani tam log4j özellikleri dosya olacaktır:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 
log4j.appender.FOO.Threshold = INFO 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 
log4j.appender.BAR.Threshold = WARN 
+0

bu de tüm güzel ve, ama bu istendi değil şeydir. Bu nasıl kaydediciler tarafından ayırt edilir? orijinal soru sadece 'foobar' foo'ya gider ve foobar da dahil olmak üzere tüm logger'lar –

+0

bar'a gider. Soru, 'foobar' logger'ının tüm' INFO' mesajlarının 'foo.log' dosyasına ve tüm' 'ye gittiği bir çözüm sorar. Tüm logger'lar için WARN' mesajları 'bar.log' dosyasına gider (ve ayrıca her bir günlük mesajının sadece bir kez uygun dosyaya yazıldığını). –

+0

no, __all loggers__, sadece 'foobar' değil' bar.log''a gönderilir. : "Şu anda, foo.log dosyasındaki foobar" adlı foobar adlı özel logger 'INFO' düzey verilerini ve daha sonra bardaki __all loggers__ için tüm 'WARN' seviyesi log mesajlarını kaydetmeye çalışıyorum. log dosyası." –