本文主要是介绍logstash收不到logback发送的日志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
版本:
<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> {@Overridepublic 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);}
}
这篇关于logstash收不到logback发送的日志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!