不断获取“可能已访问以下记录器集”的日志

may*_*ran 4 java logging intellij-idea logback slf4j

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我已经配置了logback,以在某个位置查找配置文件,下面是日志工厂类的外观。

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);
}
Run Code Online (Sandbox Code Playgroud)

}

然后我正在检索记录器,例如

private static Logger logger = LoggerFactory.getLogger(ClassName);
Run Code Online (Sandbox Code Playgroud)

我的配置XML文件如下所示。

<?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>
Run Code Online (Sandbox Code Playgroud)

我已确保任何地方都没有其他XML。仅此一个在那里。我在这里做错了什么?为什么我不断收到此警告?请指教。

Cek*_*eki 5

您没有做错任何事。在第一次调用LoggerFactory.getLogger时,您的应用程序已经是多线程的。SLF4J的早期版本(1.7.14和更早版本)发出上述警告消息。SLF4J的最新版本(1.7.15及更高版本)将捕获在SLF4J初始化阶段生成的日志消息,并在之后立即重播它们。

更新到SLF4J的最新版本可能会解决此问题。另外,您可以在应用程序启动时更早地初始化SLF4J。