2016-05-04 14 views
3

Ich benutze Logback für die Anmeldung in meinen Anwendungen und ich bekomme ständig die folgende Warnung jedes Mal, wenn ich die Anwendung ausführen. Wenn ich die Komponententests durchführe, wird es für jede Klasse gedruckt!Kontinuierlich bekommen die "folgenden Logger Logger zugegriffen haben" Logback

SLF4J: The following set of substitute loggers may have been accessed 
SLF4J: during the initialization phase. Logging calls during this 
SLF4J: phase were not honored. However, subsequent logging calls to these 
SLF4J: loggers will work as normally expected. 
SLF4J: See also http://www.slf4j.org/codes.html#substituteLogger 
SLF4J: com.kohls.kube.service.sdk.logging.CustomAppender 
SLF4J: com.kohls.kube.service.sdk.logging.appender.mqtt.messaging.ClientMqttImpl 
SLF4J: com.kohls.service.sdk.messaging.TCPMessager 
SLF4J: com.kohls.service.sdk.logging.appender.mqtt.MQTTAppender 
SLF4J: com.kohls.service.sdk.messaging.EdgeNodeMessager 
SLF4J: com.kohls.service.sdk.messaging.SubscriptionTask 

ich die logback konfiguriert haben für die Konfigurationsdatei in einem bestimmten Ort zu suchen und unten ist, wie die Log-Factory-Klasse aussieht.

public class LoggerFactory { 

static { 
    System.setProperty("logback.configurationFile", System.getProperty("user.dir") + "\\" + "logbackConfig.xml"); 
} 

private LoggerFactory() { 

} 

public static Logger getLogger(Class className) { 
    return org.slf4j.LoggerFactory.getLogger(className); 
} 

}

Dann bin ich das Abrufen der Logger wie,

private static Logger logger = LoggerFactory.getLogger(ClassName); 

Meine Config XML-Datei sieht aus wie unten.

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

    <statusListener class="ch.qos.logback.core.status.NopStatusListener"/> 

    <!-- Send debug messages to System.out --> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <appender name="MQTT" class="com.kohls.service.sdk.logging.appender.mqtt.MQTTAppender"> 
     <!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 
      </pattern> 
     </encoder> 
     <url>tcp://localhost:1883</url> 
     <clientId>MqttAppender</clientId> 
     <topic>log</topic> 
    </appender> 

    <!-- Send debug messages to a file at "c:/jcg.log" --> 
    <appender name="FILE" 
       class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>./UpdaterLog.log</file> 
     <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n</Pattern> 
     </encoder> 

     <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
      <FileNamePattern>./archive.%i.log.zip</FileNamePattern> 
      <MinIndex>1</MinIndex> 
      <MaxIndex>10</MaxIndex> 
     </rollingPolicy> 

     <triggeringPolicy 
       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
      <MaxFileSize>2MB</MaxFileSize> 
     </triggeringPolicy> 
    </appender> 

    <!-- By default, the level of the root level is set to DEBUG --> 
    <root level="DEBUG"> 
     <!--<appender-ref ref="MQTT"/>--> 
     <!--<appender-ref ref="FILE"/>--> 
     <appender-ref ref="STDOUT"/> 
    </root> 

</configuration> 

Ich habe dafür gesorgt, dass es keine andere XMLs überall. Nur dieser ist da. Was mache ich hier falsch? Warum bekomme ich diese Warnung immer wieder? Bitte um Rat.

+0

Welche Version von SLF4J und Logback verwenden Sie? – Ceki

Antwort

4

Sie machen nichts falsch. Ihre Anwendung ist bereits an dem Punkt multi-threaded, an dem der erste LoggerFactory.getLogger-Aufruf ausgeführt wird. Frühere Versionen von SLF4J (1.7.14 und früher) geben die obige Warnmeldung aus. Neuere Versionen von SLF4J (1.7.15 und höher) erfassen Protokollmeldungen, die während der SLF4J-Initialisierungsphase erstellt wurden, und geben sie unmittelbar danach wieder.

Aktualisieren auf neuere Version von SLF4J wird wahrscheinlich das Problem lösen. Alternativ können Sie SLF4J früher beim Start Ihrer Anwendung initialisieren.