1. 程式人生 > >Logback中configuration中 name='logstash'中配置queueSize問題(傳送資料丟失)

Logback中configuration中 name='logstash'中配置queueSize問題(傳送資料丟失)

轉:https://segmentfault.com/q/1010000010320780

問題:

現在的情況是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。