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。仅此一个在那里。我在这里做错了什么?为什么我不断收到此警告?请指教。
您没有做错任何事。在第一次调用LoggerFactory.getLogger时,您的应用程序已经是多线程的。SLF4J的早期版本(1.7.14和更早版本)发出上述警告消息。SLF4J的最新版本(1.7.15及更高版本)将捕获在SLF4J初始化阶段生成的日志消息,并在之后立即重播它们。
更新到SLF4J的最新版本可能会解决此问题。另外,您可以在应用程序启动时更早地初始化SLF4J。