logstash處理檔案進度記錄機制

weixin_33766168發表於2016-11-24

假如使用如下配置處理日誌

input {
     file {
        path => "/home/vagrant/logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-*.log"
        start_position => "beginning"
        type => "sql"
        codec => json {
            charset => "UTF-8"
        }        
     }
}
output { 
    if "_grokparsefailure" in [tags] {
    }else{
        if [type] == "sql"{
                elasticsearch {
                         hosts => ["http://192.168.33.10:9200"]
                         index => "common-sql-%{+YYYY.MM.dd}"
                }
       }
    }
}
  • 所有匹配common-sql-*.log的檔案都將被處理

  • 第一次從頭開始處理檔案

  • 處理後以json格式輸出到elasticsearch

logstash如何記錄處理進度?

  • 第一次執行logstash時從頭處理檔案,假如此時有兩個檔案匹配上則按順序開始處理檔案。
  • logstash處理過程中不斷將每個檔案處理的進度寫入到某個地方,這就是sincedb。
  • sincedb一般以隱藏檔案預設寫到home目錄下面,檔名類似.sincedb_6268051ae572b42bd86b7f9e8c1e004b。
  • sincedb的格式為inode majorNumber minor Number pos。每行記錄每個檔案處理進度,比如下面的例子,表示inode為177037的檔案處理到25951716位置、inode為176956的檔案處理到32955178位置。
177037 0 64768 25951716
176956 0 64768 32955178
  • 用stat看看這兩個檔案inode資訊。可以看到兩個檔案都已經處理完了。如果沒處理完關閉了logstash則會在下次啟動時繼續處理。
[vagrant@hb-localhost ~]$ stat logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-2016-11-24.log 
  File: `logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-2016-11-24.log'
  Size: 32955178    Blocks: 64368      IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 176956      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  501/ vagrant)   Gid: (  501/ vagrant)
Access: 2016-11-24 02:08:19.058506565 +0000
Modify: 2016-11-24 01:46:14.000000000 +0000
Change: 2016-11-24 02:05:06.194122690 +0000
[vagrant@hb-localhost ~]$ stat logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-2016-11-23.log 
  File: `logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-2016-11-23.log'
  Size: 25951716    Blocks: 50688      IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 177037      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  501/ vagrant)   Gid: (  501/ vagrant)
Access: 2016-11-24 02:15:28.217978771 +0000
Modify: 2016-11-23 13:19:16.000000000 +0000
Change: 2016-11-24 02:15:27.913826772 +0000
  • 如果往這兩個檔案追加日誌則將往下繼續處理,而且也會將進度更新到sincedb檔案中。
  • 如果處理完了關閉logstash,下次再啟動時則不會再從頭開始處理,因為sincedb已經記錄了進度,不要以為start_position => “beginning”就是每次都從頭處理,如果把sincedb檔案刪了又會從頭開始處理。

========廣告時間========

鄙人的新書《Tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以到 https://item.jd.com/12185360.html 進行預定。感謝各位朋友。

為什麼寫《Tomcat核心設計剖析》

=========================

相關文章