logstash收不到logback发送的日志

版本:

<dependency>
    <groupId>net.logstash.logbackgroupId>
    <artifactId>logstash-logback-encoderartifactId>
    <version>4.8version>
dependency>
<dependency>
    <groupId>ch.qos.logbackgroupId>
    <artifactId>logback-classicartifactId>
    <version>1.2.3version>
dependency>
<dependency>
    <groupId>ch.qos.logbackgroupId>
    <artifactId>logback-coreartifactId>
    <version>1.2.3version>
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.logbackgroupId>
    <artifactId>logstash-logback-encoderartifactId>
    <version>5.2version>
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);
    }
}

你可能感兴趣的:(ELK)