Erstellen mehrerer Protokolldateien mit unterschiedlichem Inhalt mit log4j

81

Gibt es eine Möglichkeit, log4j so zu konfigurieren, dass unterschiedliche Protokollierungsstufen an verschiedene Appender ausgegeben werden?

Ich versuche, mehrere Protokolldateien einzurichten. Die Hauptprotokolldatei würde alle INFO-Nachrichten und höher für alle Klassen abfangen. (In der Entwicklung werden alle DEBUG-Nachrichten und höher sowie TRACE für bestimmte Klassen abgefangen.)

Dann hätte ich gerne eine separate Protokolldatei. Diese Protokolldatei fängt alle DEBUG-Nachrichten für eine bestimmte Teilmenge von Klassen ab und ignoriert alle Nachrichten für jede andere Klasse.

Gibt es eine Möglichkeit, das zu bekommen, wonach ich suche?

Danke, Dan


quelle
3
Wollen Sie damit, dass eine Protokolldatei DEBUG und nur DEBUG erfasst, eine andere Protokolldatei INFO und nur INFO erfasst und so weiter?
Eddie

Antworten:

70

Dies sollte Ihnen den Einstieg erleichtern:

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
quelle
3
Was macht die allerletzte Zeile?
Djangofan
1
@djangofan richtet eine benutzerdefinierte Paket- / Klassenprotokollstufe ein (z. B. com.yourpackage.yourclazz mit TRACE-Protokollierung), obwohl dies in diesem Fall bereits die Standardeinstellung war (in Zeile 1 eingerichtet), sodass nichts unternommen wird. IMO wäre dieses Beispiel besser, wenn der rootLogger INFO und "yourclass" DEBUG hätte.
Tom Clift
Die Parameter der ersten Zeile sollten TRACE, QuietAppender, LoudAppender und nicht QuietAppender, LoudAppender, TRACE sein
Richard Whitehead
26

Vielleicht so etwas?

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

Daher werden alle Infomeldungen in server.log geschrieben. Im Gegensatz dazu enthält foo.log nur Nachrichten von com.example.foo, einschließlich Nachrichten auf Debug-Ebene.

araqnid
quelle
Ist com.example.foo ein Paket oder eine Klasse?
WowBow
1
@WowBow könnte es auch sein, aber mit einem solchen Namen sieht es aus wie ein Paket. Die Verwendung von Klassennamen für Logger ist nur eine Konvention
araqnid
Vielen Dank. Ich habe beide ausprobiert, nachdem ich gefragt habe und arbeite für beide;)
WowBow
7

Ich hatte diese Frage, aber mit einer Wendung - ich habe versucht, verschiedene Inhalte in verschiedenen Dateien zu protokollieren. Ich hatte Informationen für ein LowLevel-Debug-Protokoll und ein HighLevel-Benutzerprotokoll. Ich wollte, dass der LowLevel nur zu einer Datei und der HighLevel sowohl zu einer Datei als auch zu einem Syslogd wechselt.

Meine Lösung bestand darin, die 3 Appender zu konfigurieren und dann die Protokollierung wie folgt einzurichten:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

Der Teil, der für mich schwer herauszufinden war, war, dass im 'log4j.logger' mehrere Appender aufgelistet sein könnten. Ich habe versucht, es Zeile für Zeile zu tun.

Hoffe das hilft irgendwann jemandem!

Kieveli
quelle
3

Richten Sie für die Hauptprotokolldatei / den Haupt-Appender eine ein .Threshold = INFO, um die tatsächlich im Appender protokollierte Datei auf INFO und höher zu beschränken, unabhängig davon, ob für die Protokollierer DEBUG, TRACE usw. aktiviert ist oder nicht.

Was das Fangen von DEBUG und nichts darüber angeht ... müssten Sie wahrscheinlich einen benutzerdefinierten Appender schreiben.

Ich würde jedoch empfehlen, dies nicht zu tun, da dies die Fehlerbehebung und Analyse ziemlich schwierig machen würde:

  1. Wenn Ihr Ziel darin besteht, eine einzige Datei zu haben, in der Sie nach einer Fehlerbehebung suchen können, ist es ärgerlich, Ihre Protokolldaten auf verschiedene Dateien zu verteilen. Wenn Sie nicht über eine sehr regulierte Protokollierungsrichtlinie verfügen, benötigen Sie wahrscheinlich Inhalte von DEBUG und INFO bis in der Lage sein, die Ausführung des problematischen Codes effektiv zu verfolgen.
  2. Wenn Sie weiterhin alle Ihre Debug-Meldungen protokollieren, verlieren Sie alle Leistungssteigerungen, die Sie normalerweise in einem Produktionssystem erzielen, wenn Sie die Protokollierung (Weg) verringern.
matt b
quelle
Ich hätte mein Ziel besser erklären sollen. Das Hauptprotokoll dient zum Verfolgen von Fehlern, ungewöhnlichen Bedingungen usw. an einer beliebigen Stelle in der App. Dieses Protokoll muss klein gehalten werden, damit es regelmäßig aktualisiert wird. Das spezielle Protokoll verfolgt das Verhalten eines Subsystems und muss über einen längeren Zeitraum aufbewahrt werden.
Möchten Sie ERROR-, WARN- und INFO-Nachrichten aus der zweiten Protokolldatei ausschließen?
Matt B
und in XML können Sie Parameter Threshold wie folgt hinzufügen: <appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </ kader>
Rasierer