Log4j ile farklı içerikte birden fazla günlük dosyası oluşturma


81

Log4j'yi farklı ekleyicilere farklı seviyelerde günlük kaydı verecek şekilde yapılandırmanın bir yolu var mı?

Birden çok günlük dosyası oluşturmaya çalışıyorum. Ana günlük dosyası, tüm sınıflar için tüm INFO ve üzeri iletileri yakalar. (Geliştirme aşamasında, tüm DEBUG ve üzeri mesajları ve belirli sınıflar için TRACE'i yakalar.)

Ardından, ayrı bir günlük dosyasına sahip olmak istiyorum. Bu günlük dosyası, belirli bir sınıf alt kümesi için tüm DEBUG mesajlarını yakalar ve diğer sınıflar için tüm mesajları yoksayar.

Peşinde olduğum şeyi elde etmenin bir yolu var mı?

Teşekkürler Dan

java  log4j 

3
Bir günlük dosyasının DEBUG'ı ve yalnızca DEBUG'ı, INFO'yu ve yalnızca INFO'yu yakalamak için başka bir günlük dosyasını vb.
Eddie

Yanıtlar:


70

Bu senin başlamanı sağlamalı:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

3
Son satır ne işe yarar?
djangofan

1
@djangofan, özel bir paket / sınıf günlük düzeyi (yani, TRACE günlüğü ile com.yourpackage.yourclazz) kurar, ancak bu durumda zaten varsayılan (1. satırda ayarlanmış) olduğundan hiçbir şey yapmaz. IMO Bu örnek, rootLogger INFO'ya ve "sınıfınız" DEBUG'a sahip olsaydı daha iyi olurdu.
Tom Clift

İlk satırın parametreleri TRACE, QuietAppender, LoudAppender not QuietAppender, LoudAppender, TRACE
Richard Whitehead olmalıdır.

26

Belki bunun gibi bir şey?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

Böylece tüm bilgi mesajları server.log'a yazılır; tersine, foo.log hata ayıklama seviyesindeki mesajlar dahil olmak üzere yalnızca com.example.foo mesajlarını içerir.


Com.example.foo bir paket mi yoksa bir sınıf mı?
WowBow

1
@WowBow her ikisi de olabilir, ama böyle bir isimle bir pakete benziyor. kaydediciler için sınıf adları kullanmak sadece bir
kuraldır

Teşekkürler. Her ikisini de sorduktan sonra denedim ve ikisi için de çalıştım;)
WowBow

7

Bu soruyu sormuştum, ancak bir bükülme ile - Farklı dosyalara farklı içerik kaydetmeye çalışıyordum. Bir LowLevel hata ayıklama günlüğü ve bir HighLevel kullanıcı günlüğü için bilgilerim vardı. LowLevel'in yalnızca bir dosyaya gitmesini ve HighLevel'in hem bir dosyaya hem de syslogd'ye gitmesini istedim.

Çözümüm, 3 ekleyiciyi yapılandırmak ve ardından günlüğü şu şekilde ayarlamaktı:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

Anlaması benim için zor olan kısım, 'log4j.logger'ın birden çok eki listelenmiş olabileceğiydi. Her seferinde bir satır yapmaya çalışıyordum.

Umarım bu bir noktada birine yardımcı olur!


3

Ana günlük dosyası / ekleyici için, .Threshold = INFOkaydedicilerin DEBUG, TRACE, vb. Etkin olup olmadığına bakılmaksızın, ekleyicide gerçekte INFO ve üzeri olarak kaydedilenleri sınırlamak için bir ayarlayın .

DEBUG'ı yakalamaya gelince ve bunun üstünde hiçbir şey yok ... muhtemelen özel bir ekleyici yazmanız gerekir.

Ancak, sorun giderme ve analizi oldukça zorlaştıracak gibi göründüğü için bunu yapmamanızı tavsiye ederim:

  1. Amacınız, bir sorunu gidermek için bakabileceğiniz tek bir dosyaya sahip olmaksa, günlük verilerinizi farklı dosyalara yaymak can sıkıcı olacaktır - çok düzenli bir günlük kaydı politikanız yoksa, muhtemelen hem DEBUG hem de INFO'dan içeriğe ihtiyacınız olacaktır. Sorunlu kodun yürütülmesini etkin bir şekilde izleyebilme.
  2. Hala tüm hata ayıklama mesajlarınızı günlüğe kaydederek, günlük kaydını (yolu) kapatarak genellikle bir üretim sisteminde elde ettiğiniz performans kazanımlarını kaybedersiniz.

Amacımı daha iyi açıklamalıydım. Ana günlük, uygulamanın herhangi bir yerinde hataları, olağandışı koşulları vb. İzleme içindir - bu günlük küçük tutulmalıdır, böylece düzenli olarak yenilenir. Özel günlük, bir alt sistemin davranışını izler ve uzun süre saklanması gerekir.

ERROR, WARN, INFO mesajlarını ikinci günlük dosyasından çıkarmak istiyor musunuz?
matt

ve XML'de şu şekilde Eşik parametresi ekleyebilirsiniz: <appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </appender>
jilet

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.