Logstash

年度翻轉的logstash時間戳

  • January 5, 2015

我們使用 logstash 來儲存/搜尋來自我們郵件伺服器的日誌。我今天注意到今年(2015 年)我們沒有任何指數。快速調查顯示目前日誌儲存為 2014.01.05(即同一天但去年),並且這些索引正在被查找舊索引的 cron 作業刪除。

重新啟動 logstash 修復了一些問題,所以我假設 logstash 正在根據它開始的時間填寫年份資訊。

我們使用 Elasticsearch 1.2.4 執行 Logstash 1.4.1。所以不是最新版本的 Elasticsearch,但我在 1.4.2 的更新日誌中看不到任何相關內容。

使用下面的 syslog - config 將日誌條目連同輸入行和解析輸出的範例一起發送到 logstash。

有沒有比記得在元旦重新啟動 Logstash 更好的解決方法?


輸入線範例

Jan  5 15:03:35 cheviot22 exim[15034]: 1Y89Bv-0003uU-DD <= redmine@ncl.ac.uk H=adudeviis.ncl.ac.uk (campus) [10.8.232.56] P=esmtp S=2548 id=redmine.journal-1487.20150105150334@ncl.ac.uk

{
 "_index": "logstash-2014.01.05",
 "_type": "mails",
 "_id": "HO0TQs66SA-1QkQBYd9Jag",
 "_score": null,
 "_source": {
   "@version": "1",
   "@timestamp": "2014-01-05T15:03:35.000Z",
   "type": "mails",
   "priority": 22,
   "timestamp": "Jan  5 15:03:35",
   "logsource": "cheviot22",
   "program": "exim",
   "pid": "15034",
   "severity": 6,
   "facility": 2,
   "facility_label": "mail",
   "severity_label": "Informational",
   "msg": "1Y89Bv-0003uU-DD <= redmine@ncl.ac.uk H=adudeviis.ncl.ac.uk (campus) [10.8.232.56] P=esmtp S=2548 id=redmine.journal-1487.20150105150334@ncl.ac.uk",
   "tags": [
     "grokked",
     "exim_grokked",
     "dated"
   ],
   "xid": "1Y89Bv-0003uU",
   "exim_rcpt_kv": "redmine@ncl.ac.uk H=adudeviis.ncl.ac.uk (campus) [10.8.232.56] P=esmtp S=2548 id=redmine.journal-1487.20150105150334@ncl.ac.uk",
   "H": "adudeviis.ncl.ac.uk",
   "P": "esmtp",
   "S": "2548",
   "id": "redmine.journal-1487.20150105150334@ncl.ac.uk"
 },
 "sort": [
   1388934215000,
   1388934215000
 ]
}

Logstash 配置(刪除了不相關的位)…

input {
   syslog {
       codec => "plain"
       debug => false
       port => 514
       type => "mails"
   }
}

filter {
   mutate {
       remove_field => [ "path", "host" ]
   }

   if [type] == "mails" {
       grok {
           patterns_dir => [ "/etc/logstash/patterns" ]
           match => [ "message",  "(?<msg>.*)" ]
           add_tag => [ "grokked" ]
           break_on_match => true
           remove_field => [ "message" ]
       }
   }

   date {
       match => [ "timestamp", "ISO8601", "MMM dd HH:mm:ss", "MMM  d HH:mm:ss"]
       add_tag => [ "dated" ]
   }
}

output {
       elasticsearch {
               cluster => "logstash"
       host => "iss-logstash01"
       flush_size => 1000
       index => "logstash-%{+YYYY.MM.dd}"
       }
}

在 logstash-users Google 組中找到了一個回答指針(這讓我忘記了)。最近的討論指向https://logstash.jira.com/browse/LOGSTASH-1744,它 (a) 確認其他人看到的和我一樣,並且 (b) 提供了幾個可能的解決方案。

選項 1 是 Elasticsearch 的一個更新檔(不在標準發行版中),它更新了 Logstash 對當年的想法。

選項 2 是不解析來自 syslog 行的時間戳,而僅依賴於消息到達 Logstash 的時間。這對我們來說可能是一個可以接受的解決方案,因為行的順序比確切的時間更重要(只要它很接近)。

引用自:https://serverfault.com/questions/656400