welcome to star my articles-translator, providing you advanced articles translation. Any suggestion, please issue or contact me
LICENSE: MIT

在 ELK 中, Logstash 處理資源繁重的日志聚合和處理的任務。 Logstash 執行的處理工作確定我們的日志消息被正确解析和結構化,并且這種結構使你能夠更容易地在 Elasticsearch 中進行索引分析和資料可視化。
對資料執行什麼精确處理由你在 Logstash 配置檔案的 filter 部分确定。 在本節中,你可以從大量的官方支援和社群 filter 插件中選擇進而決定如何轉換日志。 最常用的過濾器插件是 grok,但是還有一些其他非常有用的插件可以使用。
你使用的插件當然取決于日志本身,但本文嘗試列出你最有可能在涉及 Logstash 的任何日志進行中找到的五個插件。
1 grok
如上所述,grok 是 Logstash 中最常用的過濾器插件。 盡管事實上它不容易使用,但是 grok 非常受歡迎,因為它允許你将非結構化日志結構化。
以下面的随機日志消息為例:
2016-07-11T23:56:42.000+00:00 INFO
[MySecretApp.com.Transaction.Manager]:Starting transaction for session
-464410bf-37bf-475a-afc0-498e0199f00
我們使用的 grok 正則就跟下面一樣:
filter {
grok {
match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log-level} [%{DATA:class}]:%{GREEDYDATA:message}" }
}
}
處理之後,日志消息就會處理成下面這樣:
{
"timestamp" => "2016-07-11T23:56:42.000+00:00",
"log-level" =>"INFO",
"class" =>"MySecretApp.com.Transaction.Manager"
"message" => "Starting transaction for session -464410bf-37bf-475a-afc0-498e0199f008"
}
這就是 Elasticsearch 如何索引日志消息。 以此格式排序,日志消息已被分解成邏輯命名的字段,可以更容易地查詢,分析和可視化。
在這篇文章中可以找到更多關于 grok 如何工作和使用的資訊。
2 mutate
另一個常見的 Logstash filter 插件是 mutate。 顧名思義,這個 filter 允許你通過“改變”各個字段真正地轉換你的日志消息。 例如,你可以使用 filter 來更改字段,将它們拼接在一起,重命名它們等等。
使用上面的日志作為示例,使用 mutate 插件的 lowercase 配置選項,我們可以将“log-level”字段轉換為小寫:
filter {
grok {...}
mutate { lowercase => [ "log-level" ] }
}
mutate 插件是更改日志格式的好方法。 這裡列出了插件的不同配置選項的完整清單。
3 date
如果分析日志和事件未按時間順序排列怎麼辦?
Logstash date filter 插件可用于從日志消息中提取時間和日期,并将其定義為日志的時間戳字段(@timestamp)。 一旦定義,這個時間戳字段将以正确的時間順序排列日志,并幫助你更有效地分析它們。
有幾十種(如果不是數百種)不同的方式可以在日志中格式化時間和日期。
以下是Apache通路日志的示例:
200.183.100.141 - - [25/Nov/2016:16:17:10 +0000] "GET
/wp-content/force-download.php?file=../wp-config.php HTTP/1.0" 200
3842 "http://hack3r.com/top_online_shops" "Mozilla/4.0 (compatible;
MSIE 8.0; Windows NT 5.1; Trident/4.0; YTB720; GTB7.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
使用 date filter 如下,我們可以提取日期和時間正則,并将其定義為@timestamp字段,并根據此所有日志将按以下排序:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp" }
}
請注意,如果不使用日期過濾器,Logstash将根據輸入時間自動設定時間戳。
在這裡閱讀有關其他配置選項。
4 json
JSON 是一種非常受歡迎的日志格式,因為它允許使用者編寫可以輕松讀取和分析的結構化和标準化的消息。
為了維護整個消息或特定字段的 JSON 結構,Logstash json filter 插件使你能夠在日志消息中提取和維護 JSON 資料結構。
下面的示例是一個格式為 JSON 的 Apache 通路日志:
{
"time":"[30/Jul/2017:17:21:45 +0000]",
"remoteIP":"192.168.2.1",
"host":"my.host.local",
"request":"/index.html",
"query":"",
"method":"GET",
"status":"200",
"userAgent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; YTB720; GTB7.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)", "referer":"-"
}
我們可以使用 json filter 來保留資料結構,而不是将日志平鋪成一行:
filter { json { source =>"message" target => "log" } } }
source 配置選項定義日志中的哪個字段是你要解析的 JSON。 在這個例子中,整個消息字段是一個 JSON。 我還使用目标選項将 JSON 擴充為名為 log 的字段中的資料結構。
在這裡閱讀有關其他配置選項。
5 kv
鍵值對或 KVP 是另一種常用的日志格式。 像 JSON 一樣,這種格式主要是因為它是可讀的,Logstash kv filter 插件允許你自動解析消息或以這種方式格式化的特定字段。
以此日志為例:
2017-07025 17:02:12 level=error message="connection refused" service="listener" thread=125 customerid=776622 ip=34.124.233.12 queryid=45
我可以使用以下 kv filter 來訓示 Logstash 如何處理它:
filter {
kv {
source => "metadata"
trim => "\""
include_keys => [ "level","service","customerid",”queryid” ]
target => "kv"
}
}
請注意配置選項的使用。 我正在使用 source 來定義字段來執行 key = value 搜尋,trim 以忽略特定字元,include_keys指定應該添加到日志中的解析 key,并且定位到所有 key 對象的容器, 再放入值。
在這裡閱讀有關其他配置選項。
總結
正如我在文章開頭所說,有大量的 Logstash filter 插件可供你使用。 你使用哪一個當然取決于您要處理的具體日志消息。
值得一提的其他非常有用的過濾器插件是 geoip(用于添加IP字段的地理資料)和 csv(用于解析CSV日志)插件。
雖然這些插件中的每一個都是有用的,但是當它們一起用于解析日志時,它們的全部功能被釋放。 實際上,在大多數情況下,你最有可能使用 grok 和至少一個或兩個附加插件的組合。 這種組合使用将保證你的日志在 Logstash 的另一端完美格式化!