Logback Logger 没有 Appenders
Logback Logger has no Appenders
我有一个使用 slf4 和 logback 的 Vaadin 网络应用程序。我在其中使用控制台和 DBAppender。如果我在测试用例中使用日志记录,一切正常:
@Test
public void test() {
Logger logger= LoggerFactory.getLogger("TEST");
logger.info("Teste");
}
但是如果我在 Applikation 中使用 Logger,则什么也不会发生。 Logback 没有调试输出,我的记录器调用也没有输出。
Gradle:
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug ="true">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource
class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>org.postgresql.Driver</driverClass>
<url>jdbc:postgresql://localhost:5432/test</url>
<user>postgres</user>
<password></password> <!-- no password -->
</connectionSource>
</appender>
<!-- the level of the root level is set to DEBUG by default. -->
<root level="INFO">
<appender-ref ref="stdout" />
<appender-ref ref="db" />
</root>
</configuration>
编辑: 当我删除 logback-dependencies 并添加
compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
一切正常,但遗憾的是这不是一个选项,因为我需要 dpAppender
EDIT2
通过调试,我发现根本没有向记录器添加附加程序。在 ch.qos.logback.classic 中的以下代码中:
public void callAppenders(ILoggingEvent event) {
int writes = 0;
for (Logger l = this; l != null; l = l.parent) {
writes += l.appendLoopOnAppenders(event);
if (!l.additive) {
break;
}
}
// No appenders in hierarchy
if (writes == 0) {
loggerContext.noAppenderDefinedWarning(this);
}
}
private int appendLoopOnAppenders(ILoggingEvent event) {
if (aai != null) {
return aai.appendLoopOnAppenders(event);
} else {
return 0;
}
}
aai 的大小为 0
您的记录器实例
Logger logger= LoggerFactory.getLogger("TEST");
不引用任何名为 "TEST" 的现有记录器。
我认为你应该像这样在 logback.xml 中定义一个记录器:
<logger name="webAppLogger" level="info">
<appender-ref ref="stdout" />
<appender-ref ref="db" />
</logger>
然后当您想在应用程序中使用记录器时引用它,如下所示:
Logger logger= LoggerFactory.getLogger("webAppLogger");
现在 Logback 应该使用您在 logback.xml 中定义的 webAppLogger。在那里你还定义了 webAppLogger 使用两个定义的 appender "stdout" 和 "db"
缺少 Appenders 是由我用来执行应用程序的 gradle vaadin plug-in 引起的。当我用 gretty 替换 vaadin plug-in 时,它就解决了。
我有一个使用 slf4 和 logback 的 Vaadin 网络应用程序。我在其中使用控制台和 DBAppender。如果我在测试用例中使用日志记录,一切正常:
@Test
public void test() {
Logger logger= LoggerFactory.getLogger("TEST");
logger.info("Teste");
}
但是如果我在 Applikation 中使用 Logger,则什么也不会发生。 Logback 没有调试输出,我的记录器调用也没有输出。
Gradle:
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug ="true">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource
class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>org.postgresql.Driver</driverClass>
<url>jdbc:postgresql://localhost:5432/test</url>
<user>postgres</user>
<password></password> <!-- no password -->
</connectionSource>
</appender>
<!-- the level of the root level is set to DEBUG by default. -->
<root level="INFO">
<appender-ref ref="stdout" />
<appender-ref ref="db" />
</root>
</configuration>
编辑: 当我删除 logback-dependencies 并添加
compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
一切正常,但遗憾的是这不是一个选项,因为我需要 dpAppender
EDIT2 通过调试,我发现根本没有向记录器添加附加程序。在 ch.qos.logback.classic 中的以下代码中:
public void callAppenders(ILoggingEvent event) {
int writes = 0;
for (Logger l = this; l != null; l = l.parent) {
writes += l.appendLoopOnAppenders(event);
if (!l.additive) {
break;
}
}
// No appenders in hierarchy
if (writes == 0) {
loggerContext.noAppenderDefinedWarning(this);
}
}
private int appendLoopOnAppenders(ILoggingEvent event) {
if (aai != null) {
return aai.appendLoopOnAppenders(event);
} else {
return 0;
}
}
aai 的大小为 0
您的记录器实例
Logger logger= LoggerFactory.getLogger("TEST");
不引用任何名为 "TEST" 的现有记录器。
我认为你应该像这样在 logback.xml 中定义一个记录器:
<logger name="webAppLogger" level="info">
<appender-ref ref="stdout" />
<appender-ref ref="db" />
</logger>
然后当您想在应用程序中使用记录器时引用它,如下所示:
Logger logger= LoggerFactory.getLogger("webAppLogger");
现在 Logback 应该使用您在 logback.xml 中定义的 webAppLogger。在那里你还定义了 webAppLogger 使用两个定义的 appender "stdout" 和 "db"
缺少 Appenders 是由我用来执行应用程序的 gradle vaadin plug-in 引起的。当我用 gretty 替换 vaadin plug-in 时,它就解决了。