2014-07-11 6 views
8

Welchen Filter sollte ich verwenden, um bestimmte Ebene zu definieren, um mit apender protokolliert werden? Zum Beispiel:Log4j2 Filter bestimmte Ebene in Apender

java:

LOGGER.debug("Debug message"); 
LOGGER.info("Info message"); 
LOGGER.warn("Warn message"); 
LOGGER.error("Error message"); 
LOGGER.fatal("Fatal message"); 

log4j2.xml:

<Configuration> 
    <Appenders> 
     <Console name="info-stdout-message"> 
      <PatternLayout pattern="[%logger{36}] %message %n" /> 
      <ThresholdFilter level="info"/> 
     </Console> 

     <Console name="detailed-stdout-message"> 
      <PatternLayout pattern="[%logger{36}] [%level] %message %n" /> 
     </Console> 

     <File name="file-appender" fileName="logs/debug.log"> 
      <PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" /> 
     </File> 
    </Appenders> 

    <Loggers> 
     <Root level="debug"> 
      <AppenderRef ref="file-appender" level="debug" /> 
      <AppenderRef ref="info-stdout-message" level="info"/> 
      <AppenderRef ref="detailed-stdout-message" level="info"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Die Dateiausgabe ist in Ordnung, aber in der Konsole habe ich ein solches Ergebnis:

[application.Main] [INFO] Info message 
[application.Main] Info message 
[application.Main] [WARN] Warn message 
[application.Main] Warn message 
[application.Main] [ERROR] Error message 
[application.Main] Error message 
[application.Main] [FATAL] Fatal message 
[application.Main] Fatal message 

aber ich benötigt appender, um nur INFO-Nachrichten auszugeben, während detailed-stdout-message alle EXEPT INFO ausgibt. Die Konsolenausgabe sollte also wie folgt aussehen:

Kann nicht herausfinden, wie Filter verhindert werden, die Ebenenvererbung zu beachten. Ist es möglich, dies zu tun?

+0

Gibt es eine Möglichkeit, es programmatisch zu tun, anstatt die Konfigurationsdatei die Filterstufe zu setzen? – testerjoe2

Antwort

10

Ich bin nicht 100% sicher, dass es funktionieren wird, aber geben diese einen Versuch:

<Console name="info-stdout-message"> 
    <PatternLayout pattern="[%logger{36}] %message %n" /> 
    <Filters> 

     <!-- Now deny warn, error and fatal messages --> 
     <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> 
     <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> 
     <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/> 

     <!-- This filter accepts info, warn, error, fatal and denies debug/trace --> 
     <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 
    </Filters> 
</Console> 
+0

funktioniert nicht, aber sehr nahe an der Arbeit. Gruppe Filter in '' Tag, verschieben ACCEPT-Regel an das Ende der Liste und ich werde die Antwort genehmigen – ovnia

16

Hier zwei Konsole Appender. Einer protokolliert alle Trace-, Debug- und Info-Level nach std_out, der andere protokolliert alle Warnungen, Fehler und fatalen Levels nach std_err. Dies ist sehr nützlich, z.B. in der Eclipse, da std_err rot angezeigt wird.

<Console name="STDOUT" target="SYSTEM_OUT"> 
    <PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" /> 
    <Filters> 
     <ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT" /> 
    </Filters> 
</Console> 

<Console name="STDERR" target="SYSTEM_ERR"> 
    <PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" /> 
    <Filters> 
     <ThresholdFilter level="WARN" onMatch="ACCEPT" /> 
    </Filters> 
</Console> 
1

Es dauerte sehr lange, herauszufinden, wie eine Reihe von Loglevel über die log4j2.xml Konfigurationsdatei zu filtern. Im Ende das für mich gearbeitet:

<Filters> 
    <ThresholdFilter level="trace" /> 
    <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" /> 
</Filters> 

In diesem Fall Log4J werden alle Meldungen von Level.TRACE zu Level.DEBUG anmelden, werden alle Ebenen unterhalb Level.DEBUG ignoriert.

0

Bitte überprüfen Sie alle log4j2 Filtermöglichkeiten bei https://logging.apache.org/log4j/2.0/manual/filters.html

Beispielkonfiguration Fragment

...  
<Console name="DEFAULT" target="SYSTEM_OUT"> 
    <PatternLayout> 
     <Pattern>[%d][%p][%c:%L:%M] - %m%n</Pattern> 
    </PatternLayout> 
    <Filters> 
     <RegexFilter regex="(?s).*(sql01|sql02|sql03).*" onMatch="DENY" onMismatch="NEUTRAL"/> 
    </Filters> 
</Console> 
... 
0

Eigentlich aus Ihrer Frage sieht es aus wie Sie nicht zwei verschiedene Appen wollen, aber zwei verschiedene Muster, die verwenden unter anderen Umständen. Dazu sollten Sie nur einen PatternSelector verwenden.

<Console name="stdout-message"> 
     <ScriptPatternSelector defaultPattern="[%logger{36}] [%level] %message %n"> 
     <Script name="BeanShellSelector" language="bsh"><![CDATA[ 
      if (logEvent.getLevel() == Level.INFO) { 
      return "INFO"; 
      } else { 
      return null; 
      }]]> 
     </Script> 
     <PatternMatch key="INFO" pattern="[%logger{36}] %message %n"/> 
     </ScriptPatternSelector> 
    </Console>