2016-08-07 31 views
2

Ich habe meine logback.xml definiert als:Logback mehrere Logger nicht eben zu Ehren

<?xml version="1.0" encoding="UTF-8"?> 
<configuration debug="true"> 

    <jmxConfigurator /> 

    <appender name="ROOT_FILE_APPENDER" 
     class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <encoder class="net.logstash.logback.encoder.LogstashEncoder"> 
      <fieldNames> 
       <timestamp>timestamp</timestamp> 
       <version>[ignore]</version> 
       <levelValue>[ignore]</levelValue> 
      </fieldNames> 
     </encoder> 
     <file>root.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 
      <fileNamePattern>root.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> 
      <maxFileSize>$100MB</maxFileSize> 
      <totalSizeCap>1GB</totalSizeCap> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
    </appender> 

    <appender name="basic-text" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <encoder> 
      <pattern>%X{Logging-CorrelationId} %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
     <file>text.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 
      <fileNamePattern>text.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> 
      <maxFileSize>100MB</maxFileSize> 
      <totalSizeCap>1GB</totalSizeCap> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
    </appender> 

    <root level="ERROR"> 
     <appender-ref ref="ROOT_FILE_APPENDER" /> 
    </root> 

    <logger name="it.pkg.testpkg.service" additivity="true" level="INFO"> 
     <appender-ref ref="basic-text"/> 
    </logger> 

</configuration> 

Bitte beachten Sie, dass die „root“ Logger Ebene wurde auf „ERROR“ gesetzt und der andere Logger Ebene gesetzt wurde zu "INFO" mit Additivität = wahr.

Meine Java-Klasse hat Code, der wie folgt aussieht: Jetzt

private static final Logger LOGGER = LoggerFactory.getLogger(it.pkg.testpkg.service.EchoService.class); 

, das Problem ist, wenn ich eine Protokollierung als:

LOGGER.info("Test Log"); 

Der Protokolleintrag geht sowohl in den Log-Dateien, obwohl die Root-Logger-Ebene auf "ERROR" gesetzt wurde. In dem Moment, in dem ich den "it.pkg.testpkg.service" -Logger loslasse (indem ich ihn ausnotiere oder lösche), hört der Eintrag auf, in den Root-Logger zu gehen. Ich bin mir nicht sicher, was hier vor sich geht.

<filter class="ch.qos.logback.classic.filter.LevelFilter"> 
    <level>ERROR</level> 
    <onMatch>ACCEPT</onMatch> 
    <onMismatch>DENY</onMismatch> 
</filter> 

aber ich will nicht meine appender werden gebunden mit einem bestimmten Protokollebene:

Vorerst habe ich eine vorübergehende Lösung durch Zugabe von unter Eintrag in „ROOT_FILE_APPENDER“ gefunden. Ist das ein Fehler bei Logback oder mache ich hier etwas falsch?

Ich verwende unter pom Abhängigkeiten:

<dependency> 
    <groupId>net.logstash.logback</groupId> 
    <artifactId>logstash-logback-encoder</artifactId> 
    <version>4.7</version> 
</dependency> 

<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-access</artifactId> 
    <version>1.1.7</version> 
</dependency> 

<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version>1.1.7</version> 
</dependency> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-core</artifactId> 
    <version>1.1.7</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.7.21</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.21</version> 
</dependency> 

Jede mögliche Hilfe würde geschätzt.

Danke.

Antwort

1

Verhalten für Vorfahren Logger erreicht durch additivity überspringt Log-Level-Prüfungen.

Wenn Ihr Logger

<logger name="it.pkg.testpkg.service" additivity="true" level="INFO"> 
    <appender-ref ref="basic-text"/> 
</logger> 

ein Anweisungslog akzeptiert

LOGGER.info("Test Log"); 

dann die entsprechende Ausgabe wird auf seiner Vorfahren Logger gesendet werden, unabhängig davon wird die Protokollebene des Loggers.

Sie können jederzeit eingestellt additivity-false und das Root-Datei appender zu Logger

<logger name="it.pkg.testpkg.service" additivity="false" level="INFO"> 
    <appender-ref ref="basic-text"/> 
    <appender-ref ref="ROOT_FILE_APPENDER" /> 
</logger> 
+1

Unser Ziel hinzuzufügen ist, dass nur Fehler Ebene protokolliert root-Logger erreichen. Idealerweise sollte Logger immer die ihm zugewiesene Ebene berücksichtigen. Was ist der Zweck dieses Verhaltens? – Shailesh

+0

_Logger sollte immer die ihm zugewiesene Ebene berücksichtigen_ Sie melden sich nicht beim Root-Logger an. Sie loggen sich in den 'it.pkg.testpkg.service'-Logger ein und erben dessen Appender. Das ist der Zweck der "Additivität". –