Logback中configuration中 name='logstash'中配置queueSize問題(傳送資料丟失)
問題:
現在的情況是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">
<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。