2013-09-16 13 views
35

Ich bin glücklich mit SLF4J mit Logback und verwenden 2 Appender für die ROOT Logger.Wie erstellt man 2 verschiedene ROOT Logger mit Logback?

<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
    <appender-ref ref="FILE" /> 
</root> 

Wie konnten wir haben verschiedene log-Stufen für beide Appen? Ich brauche immer noch alle ROOT-Logger-Nachrichten.

  • DEBUG -Niveau für STDOUT
  • INFO -Niveau für FILE

alle brauchen die Protokoll Teil der Ausgabe zu sein (so der ROOT-Logger ist erforderlich).

Alle Hilfe wird sehr geschätzt. Vielen Dank.

Antwort

44

Sie werden nie mehr als einen Root-Logger haben, daher ist Ihre Frage ein wenig irreführend. Was Sie suchen, ist, wie Sie genau abstimmen, welche Ereignisse jeder der Appender protokolliert.

http://logback.qos.ch/manual/filters.html#thresholdFilter

<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
    <level>INFO</level> 
</filter> 

konfigurieren Ebene INFO für die FILE-appender und DEBUG für STDOUT:

Und dafür Sie eine ThresholdFilter zu jedem der Appen hinzuzufügen.

Edit: Ich habe die andere Antwort der Ladung zu bestreiten, dass dies eine falsch ist: Ja, Sie mehr als ein Wurzel- Element in der Konfiguration haben können. Das erzeugt nicht mehr als eine Wurzel - Logger obwohl, was der Titel der Frage verlangt. Auch die logback Handbuch Staaten unter http://logback.qos.ch/manual/configuration.html#syntax (Hervorhebung von mir):

Dennoch ist die sehr einfache Struktur der Konfigurationsdatei kann wie beschrieben, < Konfiguration> -Element, gefolgt von null oder mehr < appender> -Elemente , gefolgt von null oder mehr < logger> elements, gefolgt von höchstens < root> element.

Es könnte funktionieren, aber zumindest ist es gegen Konvention.

+0

Ich habe ' 'und es meldet sich immer noch die beiden Appender an, wie ist es möglich? – piechuckerr

+0

Ich bezweifle, dass jemand Ihnen mit so wenig Informationen helfen könnte. Wenn Sie ein Problem zu lösen haben, öffnen Sie bitte eine neue Frage, Kommentare sind nicht der richtige Ort dafür. – sheltem

+0

Es scheint zu funktionieren, aber nicht nur die Dokumentation, sondern auch der Code zeigt Unterstützung für nur einen Root-Logger, so dass ich vermute, einige der Funktionen des Root-Logger wird verpasst. Z.B. Wenn Sie 2 Root-Logger deklarieren und einer eine andere Ebene hat, was ist die Standardstufe? Beachten Sie, wie der [Quellcode] (https://github.com/qos-ch/logback/blob/master/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java) erstellt und erstellt wird initialisiert einen _single_ root logger im Konstruktor. – Rhubarb

6

Die vorherige Antwort ist falsch: Sie mehr root Elemente verfügen, die jeweils mit einem zugehörigen Logging level und eine appender-ref (I mit logback arbeitete.version>1.0.13) In diesem Fall müssen Sie auch einen Filter in Ihr Appen setzen, wie folgt aus:

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> 
    <resetJUL>true</resetJUL> 
</contextListener> 

<!-- To enable JMX Management --> 
<jmxConfigurator/> 

<appender name="console-info" class="ch.qos.logback.core.ConsoleAppender"> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
    <level>INFO</level> 
    <onMatch>ACCEPT</onMatch> 
    <onMismatch>DENY</onMismatch> 
    </filter> 
    <encoder> 
     <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
    </encoder> 
</appender> 

<appender name="console-debug" class="ch.qos.logback.core.ConsoleAppender"> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
    <level>DEBUG</level> 
    <onMatch>ACCEPT</onMatch> 
    <onMismatch>DENY</onMismatch> 
    </filter> 
    <encoder> 
     <pattern>[%d{ddMMMyyyy HH:mm:ss.SS}]%-5level %logger{45} - %msg %n</pattern> 
    </encoder> 
</appender> 


<root level="info"> 
    <appender-ref ref="console-info"/> 
</root> 
<root level="debug"> 
    <appender-ref ref="console-debug"/> 
</root> 

+7

Nun, das widerspricht der Dokumentation: http://logback.qos.ch/manual/configuration. html # syntax .. "höchstens ein Element" –

+1

Ihre Konfiguration ist irreführend. Ihr 'console-debug' protokolliert nur und nur' debug' Level (z. B. nicht 'warn') und analog 'console-info' protokolliert nur 'info' Ebene. –

+0

Mit Doppel-Wurzel-Definition akkumulieren Appender? Ich denke, gemäß manueller "Info", "warn" & "Fehler" -Niveau Nachrichten werden in beiden Protokollen gehen (vorausgesetzt, Filter ist nicht für Appender gesetzt). Habe ich recht? –