版本:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.8</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
日志中也没有报错,相同的日志打印到其他appender中的时候都能正常打印输出。于是跟踪源码,发现
报错的地方在net.logstash.logback.appender.AbstractLogstashTcpSocketAppender的639行
encoder.init(tempOutputStream);
这里的encoder是net.logstash.logback.encoder.LogstashEncoder,查看继承关系,发现它继承自ch.qos.logback.core.encoder.EncoderBase,而且实现了个名为init的方法,然而EncoderBase中并没有这个方法签名,所以报错了。
public abstract class CompositeJsonEncoder<Event extends DeferredProcessingAware>
extends EncoderBase<Event> {
@Override
public void init(OutputStream os) throws IOException {
initWrapped(prefix, os);
super.init(os);
initWrapped(suffix, os);
}
换版本即可
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.2</version>
</dependency>
5.2版本中的 LogstashEncoder得继承关系中,其父类net.logstash.logback.encoder.CompositeJsonEncoder带了默认的init方法, 丢弃了老版本中@Override形式的init方法实现。
public abstract class CompositeJsonEncoder<Event extends DeferredProcessingAware> extends EncoderBase<Event> {
public void init(OutputStream outputStream) throws IOException {
Logback11Support.verifyLogback11OrBefore();
this.logback11OutputStream = outputStream;
this.initWrapped(this.prefix, outputStream);
this.initWrapped(this.suffix, outputStream);
}
}