logstash常用外掛介紹

weixin_34127717發表於2019-02-14

前言

在《使用EFK快速搭建安全可靠的日誌服務》一文中,我們已經大致介紹了分散式日誌服務的各個元件。但是對於很多實現細節,並未涵蓋到。本文主要介紹logstash用到的外掛,以及對外掛的離線打包,避免每次手動安裝外掛。本文主要分為4部分:

  1. 外掛的離線打包
  2. input外掛
  3. filter外掛
  4. output外掛

在使用外掛之前,我們先了解一個概念:事件。Logstash 每讀取一次資料的行為叫做事件。

1.外掛的離線打包

在生產環境中,logstash可能是部署到多臺機器上,如果每次logstash的安裝更新都需要手動更新一遍外掛成本是非常高的。那我們可以對用到的外掛進行offline打包。
製作logstash-offline-plugins-x.x.x.zip說明:

  1. 需要在一臺已經安裝了logstash的機器上,先給logstash安裝好所需要的外掛
  2. 然後再匯出外掛,具體命令:
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/...

在logstash安裝時通過如下命令進行外掛包的安裝:

bin/logstash-plugin install file://$(pwd)/logstash-offline-plugins.zip

安裝外掛後要及時觀察logstash的列印日誌,避免因為外掛版本衝突導致的logstash啟動失敗的情況。

2.input外掛

輸入外掛允許一個特定的事件源可以讀取到 Logstash 管道中,配置在 input {} 中,且可以設定多個。 在《使用EFK快速搭建安全可靠的日誌服務》一文中我們是分別將input、filter和output三部分的配置放到了不同的配置檔案中。input的配置在input.conf檔案中。
由於我們使用的是EFK,因此需要beats外掛。可以參考官網:https://www.elastic.co/guide/...

input {
    beats {
        port => 5044
        client_inactivity_timeout => 600
        ssl => true
        ssl_certificate_authorities => ["/home/work/certificate/chain-ca.pem"]
        ssl_certificate => "/home/work/certificate/server.crt.pem"
        ssl_key => "/home/work/certificate/server.key.pem"
        ssl_verify_mode => "force_peer"
    }
}

需要注意的是,在6.4版本以上的beats配置中,多了ssl_peer_metadata,可以拿到證書裡的meta資訊,可以便於我們後續在logstash上做一些鑑權校驗。
除了beats外掛,inputs型別外掛還有很多種,主要列舉如下:

  • elasticsearch
  • file
  • log4j
  • kafka

更多外掛配置介紹參考官網:https://www.elastic.co/guide/...

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://segmentfault.com/a/11...(感覺是官網https://www.elastic.co/guide/... 的翻譯版本)中有非常詳細的介紹。我來列舉一個自己在配置過程中遇到的示例:
對於給定的時間格式:

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" ]
    }
}

在筆者之前寫的《使用EFK快速搭建安全可靠的日誌服務》一文中,主要使用mutate外掛來add_field, remove_field, convert,gsub等操作。其中covert可以將字串型別轉換為int/long/float等型別,便於進行聚合等操作。
例如:

mutate {
  convert => {
        "averageSliceQueryTime" => "integer"
        "maxSliceQueryTime" => "integer"
  }

關於更多filter型別外掛可以參考:https://www.elastic.co/guide/...

4.output外掛

和前面介紹的input外掛一樣,output外掛也是最基礎最簡單的輸出外掛。在《使用EFK快速搭建安全可靠的日誌服務》一文中我們使用的elasticsearch作為最終的輸出儲存,因此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]}"
            ssl => true
            ssl_certificate_verification => true
            truststore => "/home/work/certificate/truststore.jks"
            truststore_password => "adofkoe"
            user => "logstash"
            password => "dafodmfkamkefadfg"
        }
    }
}

除了elasticsearch,還支援以下輸出:

  • email
  • file
  • influxdb
  • mongodb
  • redis

更多可以參考官網:https://www.elastic.co/guide/...

總結

logstash的各種外掛極大豐富了其功能。在實際使用中,我們可以根據自己的實際需求進行相關配置,來構建自己的日誌服務系統。筆者此處主要是對自己使用過程中所用到內容的總結。遇到的很多實際問題,可以自行查詢官網進行解決。

相關文章