Java 11和logback-classic-1.211。我正在尝试编写我自己的自定义appender,并遵循这篇Baeldung文章来测试它。
我的src/main/java/myapp/logging/CatAppender
附加程序(在运行时类路径上(:
public class CatAppender extends AppenderBase<ILoggingEvent> {
@Override
protected void append(ILoggingEvent eventObject) {
System.out.println("meow");
}
}
我的src/main/resources/logback.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<appender name="cat" class="myapp.logging.CatAppender"/>
<root level="info">
<appender-ref ref="cat" />
</root>
</configuration>
在我的build.gradle
中,我指定使用logback和Lombok:
plugins {
id "io.freefair.lombok" version '6.4.0'
}
dependencies {
implementation (
'ch.qos.logback:logback-classic:1.2.11'
,'org.projectlombok:lombok:1.18.16'
)
}
然后在我的Java代码中,我使用Lombok注入一个SLF4J记录器,如下所示:
@Slf4j
public class SomethingDoer {
public void doSomething() {
log.info("this should invoke the CatAppender...");
}
}
但是当SomethingDoer#doSomething()
运行时,我看不到打印到STDOUT控制台的meow
。我这里接线有错吗?
Baeldung文章中的一个主要遗漏是,您需要调用自定义appender的start()
方法,否则AppenderBase
子类将不会记录日志消息。
在我的情况下,我只是从CatAppender构造函数内部调用start()
,一切都正常:
public class CatAppender extends AppenderBase<ILoggingEvent> {
public CatAppender() {
super();
start();
}
@Override
protected void append(ILoggingEvent eventObject) {
System.out.println("meow");
}
}
FWIWstart()
被认为是初始化或构造函数级别的检查。您应该确保appender子类中的所有内容都是";健康的";足以开始日志记录,然后调用start()
。
所以在我的CCD_ 11的情况下;"猫叫";到STDOUT,我可以从构造函数内部完成。其他更复杂的子类必须弄清楚何时何地通过start()
激活appender是合适的。