现在的情况是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里的参数,依然无法解决这个问题。
有哪位大神知道,还望不吝赐教。
嗨呀,没认真看人家的官方文档啊。之前测试过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">
queueSize配置合适的大小,就可以了,发送到logstash的数据就不会丢失了。正如官方文档里写的那样:* AsyncDisruptorAppender追加器与Logback的AsyncAppender类似,不同之处在于使用LMAX Disruptor RingBuffer作为排队机制,而不是BlockingQueue。 这些异步appender可以委托给任何其他底层的logback appender。