在分佈式日誌服務技術棧ELK中,logstash承擔著日誌解析的工作,將接收到的日誌按照某些規則解析到Elasticsearch對應的不同field中。本文將介紹logstash的一些常用插件,以及對插件的離線打包,避免每次手動安裝插件。
本文主要分為4部分:
- 插件的離線打包
- input插件
- filter插件
- output插件
在使用插件之前,我們先明確一個概念:事件。Logstash 每讀取一次數據的行為叫做事件。
1.插件的離線打包
在實際生產環境中,logstash一般需要部署多個實例,會在多臺機器上進行部署,如果每次安裝logstash更新都需要手動更新一遍插件的話,運維成本是非常高的。因此可以對用到的插件進行離線打包,多次複用。以製作
logstash-offline-plugins-x.x.x.zip為例:
首先,需要在一臺已經安裝了logstash的機器上,為logstash安裝好所需要的插件;
然後再將插件進行導出,具體命令示例如下:
bin/logstash-plugin update logstash-filter-mutate bin/logstash-plugin install logstash-filter-json_encode bin/logstash-plugin prepare-offline-pack logstash-filter-mutate logstash-filter-json_encode
參考elastic的官方文檔:
https://www.elastic.co/guide/en/logstash/current/offline-plugins.html
在安裝logstash時可以通過如下命令進行插件包的安裝:
bin/logstash-plugin install file://$(pwd)/logstash-offline-plugins.zip
安裝插件後要及時觀察logstash的打印日誌,避免因為插件版本衝突導致的logstash啟動失敗的問題。
2.input插件
input插件允許一個特定的事件源可以讀取到 Logstash 管道中,配置在 input {} 中,且可以設置多個。可以將input、filter和output三部分的配置放到不同的配置文件中。input的配置放置在input.conf文件中。以beats插件為例:
input { beats { port => 5044 client_inactivity_timeout => 600 } }
需要注意的是,在6.4版本以上的beats配置中,多了ssl_peer_metadata,可以拿到證書裡的meta信息,可以便於我們後續在logstash上做一些鑑權校驗。
除了beats插件,inputs類型插件還有很多種,主要列舉如下:
- elasticsearch
- file
- log4j
- kafka
更多插件配置介紹參考官網
https://www.elastic.co/guide/en/logstash/current/input-plugins.html
3.filter插件
filter插件就比較多了。日誌接入之後要進行日誌的規則匹配、過濾等操作,配置filter是必不可少的。最長用到的filter插件有grok、date、mutate、geoip、split、uuid、json、jsonencode等。
3.1 grok插件
Grok是logstash最常用的過濾插件,grok是通過系統預定義的正則表達式或者通過自己定義正則表達式來匹配日誌中的各個值,安裝logstash後默認會有一些常用的日誌匹配正則,在使用時自己可以根據日誌格式或者對匹配正則進行調整或者直接調用。如果自己想在其他目錄定義正則規則匹配日誌,在使用時需要指定正則的路徑。
對於以下一行日誌:
55.3.244.1 GET /index.html 15824 0.043
使用如下的規則:
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
grok配置示例如下:
filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } }
那麼這行日誌經過grok之後會得到以下的field:
client: 55.3.244.1 method: GET request: /index.html bytes: 15824 duration: 0.043
常用的配置選項:
- match:用來對字段的模式進行匹配;
- patterns_dir:用來指定規則的匹配路勁,如果使用logstash自定義的規則時,不需要寫此參數。Patterns_dir可以同時制定多個存放過濾規則的目錄。語法格式:patterns_dir => [“/ opt / logstash / patterns”,“/ opt / logstash / extra_patterns”];
- remove_field:如果匹配到某個”日誌字段,則將匹配的這個日誌字段從這條日誌中刪除;
Grok過濾正則規則可以根據自己的日誌格式自行編寫,在編寫grok過濾規則時容易出錯,此時可以使用grokdebug網站對自己的日誌及編寫的正則規則進行調試,grokdebug網址為(
https://grokdebug.herokuapp.com/)。
3.2 date插件
date用於解析字段中的日期,然後使用該日期或時間戳作為事件的logstash時間戳。
對於date插件的介紹,在(
https://www.elastic.co/guide/en/logstash/6.4/plugins-filters-date.html)中有非常詳細的介紹。我來列舉一個實際配置過程中遇到的示例:
對於給定的時間格式:
2019-01-10T18:11:28.699+08:00
需要進行配置的pattern如下:
date { match => ["[@metadata][log_timestamp]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ"] timezone => "Asia/Shanghai" }
需要注意的是,對於filter.conf配置是可以熱加載的,如果時間格式配置錯誤,會導致logstash進程掛掉,可以自行追蹤logstash本身的服務日誌。
3.3 mutate插件
mutate 插件可以在字段上執行變換,包括重命名、刪除、替換和修改。
比如,我們已經根據 Grok 表達式將 Tomcat 日誌的內容放到各個字段中,現在想把狀態碼、字節大小或是響應時間,轉換成整型;
或者你已經根據正則表達式將日誌內容放到各個字段中,但是字段的值包含大小寫,這對於 Elasticsearch 的全文檢索來說,顯然用處不大,那麼可以用該插件,將字段內容全部轉換成小寫。配置示例如下:
filter { mutate { split => ["hostname", "."] add_field => { "shortHostname" => "%{hostname[0]}" } } mutate { rename => ["shortHostname", "hostname" ] } }
在實際生產環境中,主要使用mutate插件來add_field, remove_field, convert,gsub等操作。其中covert可以將字符串類型轉換為int/long/float等類型,便於進行聚合等操作。
mutate { convert => { "averageSliceQueryTime" => "integer" "maxSliceQueryTime" => "integer" }
4.output插件
和前面介紹的input插件一樣,output插件也是最基礎最簡單的輸出插件。已output到elasticsearch為例。對於grok解析失敗的文件會寫入到本地文件中,因此用了file插件,通過分支進行判斷。配置示例如下:
output { if "_grokparsefailure" in [tags] or "_jsonparsefailure" in [tags] { file { path => "/home/work/logstash/failure_output/failure-%{+YYYY-MM-dd}.log" } } else { elasticsearch { hosts => ["https://es-host1:9920","https://es-host2:9920","https://es-host3:9920"] index => "logstash-%{[@metadata][index_name]}-%{+YYYY.MM.dd}" document_id => "%{[@metadata][document_id]}" } } }
除了elasticsearch,還支持email、file、influxdb、mongodb、redis。
總結
logstash的各種插件極大豐富了其功能。在實際使用中,我們可以根據自己的實際需求進行相關配置,來構建自己的日誌服務系統。筆者此處主要是對自己使用過程中所用到內容的總結。遇到的很多實際問題,可以自行查詢官網進行解決。
歡迎關注筆者,每天分享架構乾貨。
關鍵字: 日誌 : URIPATHPARAM