logstash接受logback通过logstash-logback-encoder发送的数据时丢失,如何解决?

现在的情况是logstash能接受到数据并在es里elasticsearch能显示出来,只是数据不全,比如我发了10w条,它只能接受到1w或者2w,数据量小的时候还好,一大就差得多了。
下面是logback.xml的配置文件:

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
      <destination>192.168.4.212:8881</destination>
      <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>



    <logger name="commonLog" level="debug" additivity="false"> 
               <appender-ref ref="logstash" />  
    </logger> 

然后logstash的配置:

input{
tcp {
    host => "192.168.4.212"
    port => 8881
    type => "tcplog"
    mode => "server"
    tags => ["tags"]
    codec => json_lines
  }
}

output{
    elasticsearch{ 
         hosts=>"192.168.4.212" 
         index=>"test"
    }
}

发送完后用来查看logstash收到条数的命令:

curl "http://192.168.4.212:9200/_cat/indices?v"

我调过logstash.yml里的参数,依然无法解决这个问题。
有哪位大神知道,还望不吝赐教。

阅读 10k
1 个回答

嗨呀,没认真看人家的官方文档啊。之前测试过logback客户端通过socket发送到服务端只要eventDelayLimit参数配置合适,数据就不会丢失。还想参数logback源码修改一下logstash-logback-encoder源码来着。其实logstash-logback-encoder的GitHub说明里原文“The async appenders will never block the logging thread. If the RingBuffer is full (e.g. due to slow network, etc), then events will be dropped.”然后在源码里找到这个RingBuffer对应的字段是queueSize。其实这个queueSize之前我在logback.xml里调式过,没有作用,后来就放弃了。但之后在源码里对queueSize有注释,这个值只能配置2的N次幂(2,4,8,16...),默认8192,单位是B。所以解决方案就是:在logback的配置文件中配置:
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">

     <destination>192.168.4.212:8881</destination>
      <queueSize>1048576</queueSize>
  <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>
    

queueSize配置合适的大小,就可以了,发送到logstash的数据就不会丢失了。正如官方文档里写的那样:* AsyncDisruptorAppender追加器与Logback的AsyncAppender类似,不同之处在于使用LMAX Disruptor RingBuffer作为排队机制,而不是BlockingQueue。 这些异步appender可以委托给任何其他底层的logback appender。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏