2009-04-08 17 views
80

Gibt es eine Möglichkeit, log4j so zu konfigurieren, dass es unterschiedliche Protokollebenen für verschiedene Appender ausgibt?Erstellen mehrerer Protokolldateien mit unterschiedlichem Inhalt mit log4j

Ich versuche, mehrere Protokolldateien einzurichten. Die Hauptprotokolldatei würde alle INFO und über Nachrichten für alle Klassen abfangen. (In der Entwicklung würde es alle Nachrichten DEBUG und darüber und TRACE für bestimmte Klassen abfangen.)

Dann möchte ich eine separate Protokolldatei haben. Diese Protokolldatei würde alle DEBUG-Nachrichten für eine bestimmte Teilmenge von Klassen abfangen und alle Nachrichten für jede andere Klasse ignorieren.

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

Danke, Dan

+3

Meinst du, Sie wollen eine Logdatei DEBUG und nur DEBUG, eine andere Logdatei erfassen INFO und nur INFO, und so weiter? – Eddie

Antwort

3

Für das Haupt Logfile/appender, ein .Threshold = INFO zu begrenzen, was einzurichten tatsächlich in dem appender zu INFO und höher protokolliert wird, unabhängig davon, ob oder ob nicht die Logger haben DEBUG, TRACE, etc , aktiviert.

Um DEBUG abzufangen und nichts darüber ... müssten Sie wahrscheinlich einen benutzerdefinierten Appender schreiben.

Allerdings würde ich empfehlen, dies nicht zu tun, da es wie es klingt ziemlich hart zur Fehlerbehebung und Analyse machen würde:

  1. Wenn Ihr Ziel ist es, eine einzelne Datei zu haben, wo man etwas zu beheben sucht, dann Es ist ärgerlich, wenn Sie Ihre Protokolldaten auf verschiedene Dateien aufteilen. Wenn Sie nicht über eine sehr reglementierte Protokollierungsrichtlinie verfügen, benötigen Sie wahrscheinlich sowohl Inhalte von DEBUG als auch von INFO, um die Ausführung des problematischen Codes effektiv verfolgen zu können.
  2. Wenn Sie immer noch alle Ihre Debug-Meldungen protokollieren, verlieren Sie alle Leistungssteigerungen, die Sie normalerweise in einem Produktionssystem erzielen, indem Sie die Protokollierung (Weg) abschalten.
+0

Ich hätte mein Ziel besser erklären sollen. Das Hauptprotokoll dient zum Nachverfolgen von Fehlern, ungewöhnlichen Bedingungen usw.Irgendwo in der App - dieses Protokoll muss klein gehalten werden, damit es regelmäßig rollt. Das spezielle Protokoll verfolgt das Verhalten eines Subsystems und muss für lange Zeiträume aufbewahrt werden. –

+0

Möchten Sie die Fehlermeldungen ERROR, WARN, INFO aus der zweiten Protokolldatei ausschließen? –

+0

und in XML können Sie Parameter Threshold wie folgt hinzu: razor

70

Dies sollte Ihnen den Einstieg:

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 
+6

abgestimmt, aber es ist ein Tippfehler in Zeile 4 : log4j.appender.LoudAppender.Threshhold = INFO sollte log4j.appender.QuierAppender.Threshold = INFO sein, nein? – Olivier

+0

Ja, ich denke, das stimmt. Ich habe gerade aus dem Dokument gelesen und nicht zuerst getestet;) – jasonnerothin

+0

einige Editoren? Wir brauchen ein paar Redakteure? Daniel, kannst du deine funktionierende Antwort bestätigen? – enguerran

26

Vielleicht so etwas wie das?

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

So alle Info-Nachrichten werden in server.log geschrieben; Im Gegensatz dazu enthält foo.log nur com.example.foo-Nachrichten, einschließlich Debug-Level-Nachrichten.

+0

Ist com.example.foo ein Paket oder eine Klasse? – WowBow

+1

@WowBow könnte es entweder sein, aber mit einem solchen Namen sieht es wie ein Paket aus. Verwenden von Klassennamen für Logger ist nur eine Konvention – araqnid

+0

Danke. Ich habe beides versucht, nachdem ich gefragt und für beide gearbeitet habe;) – WowBow

7

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

war meine Lösung, die 3 Appen zu konfigurieren, und dann Setup die Protokollierung wie folgt aus:

log4j.threshold=ALL 
log4j.rootLogger=,LowLogger 

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

Der Teil, der für mich schwierig war, um herauszufinden, dass die ‚log4j.logger‘ mehrere Appen haben könnte aufgelistet. Ich habe versucht, es Zeile für Zeile zu machen.

Hoffe das hilft jemandem irgendwann!

Verwandte Themen