Logstash:Grok filter 入門

有效分析和查詢送入Elastic Stack的數據的能力取決於信息的可讀性。 這意味着,當將非結構化數據攝取到系統中時,必須將其轉換爲結構化數據。

通常,這個至關重要的任務留給Logstash(儘管還有其他日誌傳送器可用,比如Fluentd)。 無論你定義什麼數據源,都必須提取日誌並執行一些魔力來美化它們,以確保在將它們輸出到Elasticsearch之前正確地對其進行了解析。

Logstash中的數據操作是使用過濾器插件執行的。 本文重點介紹最流行和有用的過濾器插件之一-Logstash grok過濾器,該過濾器用於將非結構化數據解析爲結構化數據。

在之前我的另外一篇文章“Elasticsearch:Elastic可觀測性 - 數據結構化及處理”,我也介紹瞭如何使用ingest node來對數據進行加工和格式化。

 

什麼是Grok?

最初的術語實際上是很新的-由羅伯特·A·海因萊因(Robert A. Heinlein)在他的1961年的《陌生的土地上的陌生人》一書中創造的–指的是理解某種東西,使人們真正沉浸其中。 這是grok語言和Logstash grok插件的合適名稱,它們可以以一種格式修改信息並將其浸入另一種格式(特別是JSON)。 已經有數百種用於記錄的Grok模式。

 

Grok是如何工作的?

簡而言之,grok是一種將行與正則表達式匹配,將行的特定部分映射到專用字段中以及根據此映射執行操作的方法。

內置了超過200種Logstash模式,用於過濾AWS,Bacula,Bro,Linux-Syslog等中的單詞,數字和日期等項目。 如果找不到所需的模式,則可以編寫自己的自定義模式。 還有多個匹配模式的選項,可簡化表達式的編寫以捕獲日誌數據。

這是Logstash grok過濾器的基本語法格式:

%{PATTERN:FieldName}

這將匹配預定義的模式,並將其映射到特定的標識字段。 由於grok本質上是基於正則表達式的組合,因此你也可以創建自己的基於正則表達式的grok過濾器。 例如:

(?\d\d-\d\d-\d\d)

這將使22-22-22(或任何其他數字)的正則表達式與字段名稱匹配。

 

一個Logstash Grok 例子

這個grok調試工具是開始構建grok過濾器的好方法:https://grokdebug.herokuapp.com/。你也可以在Kibana中找到grok的調試工具:

使用此工具,您可以粘貼日誌消息並逐步構建grok模式,同時連續測試編譯。 通常,我建議從%{GREEDYDATA:message}模式開始,然後逐步添加越來越多的模式。

在上面的示例中,我將從以下內容開始:

%{GREEDYDATA:message}

比如針對這條信息:

83.149.9.216 - - [17/May/2015:10:05:03 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

我們可以看到整個信息都賦予給message了。

我們再接着嘗試如下的例子:

%{IPORHOST:clientip} - - \[%{HTTPDATE:timestamp}\] %{GREEDYDATA:message}

在上面,我們可以看到clientip, message,及timestamp。

 

常見的例子

以下是一些示例,可幫助你熟悉如何構造grok過濾器:

Syslog

用Grok解析syslog消息是新用戶更普遍的需求之一。 syslog還有幾種不同的日誌格式,因此請牢記編寫自己的自定義grok模式。 這是常見系統日誌解析的一個示例:

May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port

在Logstash中,我們應該使用如下的grok filter:

grok {
   match => { 
    "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp}
    %{SYSLOGHOST:syslog_hostname}
    %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?:
    %{GREEDYDATA:syslog_message}" 
  }
}

Apache access logs

80.135.37.131 - - [11/Sep/2019:23:56:45 +0000] "GET /item/giftcards/4852 HTTP/1.1" 200 91 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"

grok  {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
}

Elasticsearch

[2017-09-10T12:07:26,683][WARN ][index.indexing.slowlog.index] [GOgO9TD] [testindex-slowlogs/yNbyYk1ARSW_hd0YRh6J0A] took[142.3micros], took_millis[0], type[product], id[105], routing[] , source[{"price":9925,"name":"Nariko"}]

grok {
      match => ["message", "\[%{TIMESTAMP_ISO8601:timestamp}\]\[%{DATA:loglevel}%{SPACE}\]\[%{DATA:source}%{SPACE}\]%{SPACE}\[%{DATA:node}\]%{SPACE}\[%{DATA:index}\] %{NOTSPACE} \[%{DATA:updated-type}\]",
                "message", "\[%{TIMESTAMP_ISO8601:timestamp}\]\[%{DATA:loglevel}%{SPACE}\]\[%{DATA:source}%{SPACE}\]%{SPACE}\[%{DATA:node}\] (\[%{NOTSPACE:Index}\]\[%{NUMBER:shards}\])?%{GREEDYDATA}"
      ]
   }

上面有兩種匹配的方法,只要其中的一種可以匹配就可以了。

 

總結

Logstash grok只是在將日誌轉發到Elasticsearch之前可以應用於你的日誌的一種過濾器。 由於grok在測井管道中起着至關重要的作用,因此它也是最常用的過濾器之一。

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