filebeat+elasticsearch日誌內容提取

       我們知道elastisearch節點分五種類型:master(主節點)、data(數據存儲,CRUD)、ingest(預處理)、coordinating(協調節點)、tribe(部落節點,用於跨集羣)。有些時候我們需要對原始的日誌做一些加工(比如格式轉換、內容提取等),這個時候就需要使用pipeline,pipeline是在ingest節點上執行的。       

       在我們的集羣中,一條日誌可能可能被多個日誌節點記錄, 每個節點啓動一個filebeat負責收集日誌到elasticsearch。我們希望同一條日誌在elasticsearch中只出現一次,同時我們希望通過日誌的產生時間而不是收集時間來過濾日誌。日誌的唯一性,由_id決定;日誌的產生時間寫入到日誌本身中。如果我們不做任何預處理,elasticsearch會自動生成_id, @timestamp會自動錶示爲日誌收集時間。如果我們能直接從日誌中提取_id 和timestamp就好了。比如有如下一條日誌:

{"2019-12-04T11:24:45.406Z", "12422271230000354151", '[email protected]', "<7421.6089.0>", cluster_event, cluster_event, handle_event, handle_event, [ {event, stop},{msg, ""}]}.
 

一開始打算自己寫正則匹配,一是正則表達式比較複製,二是自己定義的格式不能被pipeline所識別。好在有grok可以直接使用,一番調研發現基本滿足我們的要求。pipeline的定義:

PUT _ingest/pipeline/info-pipeline
{
  "description" : "describe pipeline",
  "processors" : [
    {
      "grok": {
        "field": "message",
        "patterns": ["{\"%{TIMESTAMP_ISO8601:@timestamp}\", %{QUOTEDSTRING:_id}, '%{EMAILLOCALPART:slave}@%{IP:slave_ip}', %{QUOTEDSTRING:pid}, %{WORD:mod}"]
      }
    }
  ]
}

 filebeat.yml 配置

同一個filebeat可以收集不同格式的日誌,不同日誌的格式可以適配不同的pipeline。注意原始日誌的時間格式,如果是grok不能匹配的格式,會導致在kibana的logs菜單中無法通過時間軸查看。

ps: 本人的驗證環境:centos7+elasticsearch6.8+ filebeat6.8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章