Tworzenie wielu plików dziennika o różnej zawartości za pomocą log4j

81

Czy istnieje sposób skonfigurowania log4j tak, aby wyświetlał różne poziomy logowania do różnych programów dołączających?

Próbuję skonfigurować wiele plików dziennika. Główny plik dziennika przechwytuje wszystkie INFO i powyższe komunikaty dla wszystkich klas. (W fazie rozwoju będzie przechwytywał wszystkie komunikaty DEBUG i wyższe oraz TRACE dla określonych klas).

Następnie chciałbym mieć osobny plik dziennika. Ten plik dziennika przechwyciłby wszystkie komunikaty DEBUG dla określonego podzbioru klas i zignorowałby wszystkie komunikaty dla innych klas.

Czy jest sposób, aby dostać to, czego szukam?

Dzięki, Dan


źródło
3
Czy masz na myśli, że chcesz, aby jeden plik dziennika przechwytywał DEBUG i tylko DEBUG, inny plik dziennika przechwytujący INFO i tylko INFO, i tak dalej?
Eddie

Odpowiedzi:

70

To powinno zacząć:

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
jasonnerothin
źródło
3
Co robi ostatnia linijka?
djangofan
1
@djangofan ustawia niestandardowy poziom dziennika pakietu / klasy (tj. com.yourpackage.yourclazz z rejestrowaniem TRACE), chociaż w tym przypadku był już domyślny (skonfigurowany w linii 1), więc nic nie robi. IMO ten przykład byłby lepszy, gdyby rootLogger miał INFO, a „twoja klasa” miała DEBUG.
Tom Clift
Parametry pierwszej linii powinny być TRACE, QuietAppender, LoudAppender not QuietAppender, LoudAppender, TRACE
Richard Whitehead
26

Może coś takiego?

<!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>

W ten sposób wszystkie komunikaty informacyjne są zapisywane do server.log; z kolei foo.log zawiera tylko komunikaty com.example.foo, w tym komunikaty na poziomie debugowania.

araqnid
źródło
Czy com.example.foo jest pakietem czy klasą?
WowBow
1
@WowBow to też może być, ale z taką nazwą wygląda jak pakiet. używanie nazw klas dla
loggerów
Dzięki. Spróbowałem obu po tym, jak poprosiłem i działa dla obu;)
WowBow
7

Miałem to pytanie, ale z niespodzianką - próbowałem rejestrować różne treści w różnych plikach. Miałem informacje dotyczące dziennika debugowania LowLevel i dziennika użytkownika HighLevel. Chciałem, aby LowLevel przeszedł tylko do jednego pliku, a HighLevel do pliku i syslogd.

Moim rozwiązaniem było skonfigurowanie 3 dołączających, a następnie skonfigurowanie rejestrowania w następujący sposób:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

Część, która była dla mnie trudna do zrozumienia, polegała na tym, że „log4j.logger” mógł mieć wymienionych wielu dołączających. Próbowałem to zrobić pojedynczo.

Mam nadzieję, że to pomoże komuś w pewnym momencie!

Kieveli
źródło
3

Dla głównego pliku dziennika / programu dołączającego skonfiguruj, .Threshold = INFOaby ograniczyć to, co jest faktycznie rejestrowane w programie dołączającym do INFO i wyższych, niezależnie od tego, czy rejestratory mają włączone DEBUG, TRACE, itp.

Jeśli chodzi o łapanie DEBUG i nic ponad to ... prawdopodobnie musiałbyś napisać niestandardowy appender.

Jednak nie radziłbym tego robić, ponieważ wygląda na to, że rozwiązywanie problemów i analiza byłyby dość trudne:

  1. Jeśli Twoim celem jest posiadanie pojedynczego pliku, w którym możesz znaleźć rozwiązanie problemu, łączenie danych dziennika w różnych plikach będzie denerwujące - chyba że masz bardzo wyregulowaną politykę rejestrowania, prawdopodobnie będziesz potrzebować treści zarówno z DEBUG, jak i INFO, aby być w stanie skutecznie śledzić wykonanie problematycznego kodu.
  2. Kontynuując rejestrowanie wszystkich komunikatów debugowania, tracisz wszelki wzrost wydajności, który zwykle uzyskujesz w systemie produkcyjnym, wyłączając rejestrowanie (sposób).
matowe b
źródło
Powinienem był lepiej wyjaśnić mój cel. Główny dziennik służy do śledzenia błędów, nietypowych warunków itp. W dowolnym miejscu aplikacji - ten dziennik musi być mały, więc jest regularnie przewijany. Specjalny dziennik śledzi zachowanie jednego podsystemu i musi być przechowywany przez długi czas.
Czy chcesz wykluczyć komunikaty ERROR, WARN, INFO z drugiego pliku dziennika?
mat b
aw XML można dodać parametr Threshold w następujący sposób: <appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </appender>
brzytwa