logstash配置文件詳解

Logstash實際應用配置詳解

背景

業務目的是能夠分析nginx和apache每天產生的日誌,對url、ip、rest接口等信息進行監控,並將數據發送到elasticsearch服務。

config

輸入

從日誌文件中獲取信息

file {
    path => "/home/keepgostudio/demo/logs/test.log"
    start_position => "beginning"
}       
  • 1
  • 2
  • 3
  • 4
  • 5

過濾

grok

目前是logstash中把非標準化的日誌數據轉換成標準化並且可搜索數據最好的方式。Logstash默認提供了能分析包括java堆棧日誌、apache日誌在內的120種形式。點擊查看

如沒有特別的需求的話,使用默認的apache日誌形式就能達到想要的效果,如下。

grok{       
    match => {"message" => ["%{COMBINEDAPACHELOG}"]}        
}
  • 1
  • 2
  • 3
  • 4

但如果想要監控更多的信息,比如url上的參數,那麼默認的表達式將沒辦法滿足我們的需求,這時我們就需要自己動手去編寫一些符合我們業務需要的表達式,並告訴logstash以某種期望的方式進行數據轉換。

首先,在logstash的根目錄下創建一個patterns文件夾,這個文件夾默認是沒有的。

其次,在patterns文件夾中創建文件test_pattern(這裏爲了方便所以沒有按照pattern的功能對文件進行命名,在實際應用中最好按照功能來對文件命名,至於原因你懂的)。在test_pattern文件中可以按照“名稱 正則表達式”這樣的格式自定義一些正則表達式,以便在grok中進行使用。

最後,在使用的時候一定要把pattern_dir這個參數帶上,否則logstash無法識別你自定義的這些正則表達式。

grok {
    patterns_dir => ["/home/keepgostudio/download/logstash-5.2.0/patterns"]
    match => {
        "message" => ["%{PARAMS_APACHELOG}", "%{NO_PARAMS_APACHELOG}"]
    }
    remove_field => ["host", "timestamp", "httpversion", "@version"]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

kv

將數據源轉換成鍵值對,並創建相對的field。比如傳入“a=111&b=2222&c=3333”,輸出的時候,a,b,c會被創建成三個field,這樣做的好處是,當需要查詢某一個參數的時候可直接查詢,而不是把一個字符串搜索出來再做解析。

kv {
    source => "field_name"
    field_split => "&?"
}
  • 1
  • 2
  • 3
  • 4
  • 5

geoip

這個從字面上就能看出他的功能,根據ip查出相應的地理信息,比如城市,省份,國家,經緯度等。這個ip信息是在logstash中的一個數據源中進行搜索查找,而不是進行網絡搜索。

geoip {
    source => "field_name"
    fields => ["country_name", "region_name", "city_name", "latitude", "longitude"]
    target => "location"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

drop

drop可以跳過某些不想統計的日誌信息,當某條日誌信息符合if規則時,該條信息則不會在out中出現,logstash將直接進行下一條日誌的解析。

if [field_name] == "value" {
    drop {}
}
  • 1
  • 2
  • 3
  • 4

輸出

logstash輸出到elasticsearch時,會隨機生成一個id給每一條記錄。建議在剛開始接觸的時候,可以採用手動輸入的方式。這樣結合elasticsearch的服務,更容易理解整個實現的流程。

elasticsearch {
    hosts => ["192.168.1.44:9200"]      
    index => "logstash-test-%{type}-%{host}"        
}
  • 1
  • 2
  • 3
  • 4
  • 5

附錄

test.config

input {
    stdin {}
}

filter {
    grok {
        patterns_dir => ["/home/keepgostudio/download/logstash-5.2.0/patterns"]
        match => {
            "message" => ["%{PARAMS_APACHELOG}", "%{NO_PARAMS_APACHELOG}"]
        }
        remove_field => ["host", "timestamp", "httpversion", "@version"]
    }

    kv {
        source => "params"
        field_split => "&?"
    }

    geoip {
        source => "ip"
        fields => ["country_name", "region_name", "city_name", "latitude", "longitude"]
        target => "location"
}

output {
    elasticsearch {
        hosts => ["192.168.1.44:9200"]      
        index => "logstash-test-%{type}-%{host}"        
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

test_pattern

HTTP_URL \S+(?=\?)
HTTP_URL_WITH_PARAMS "(?:%{WORD:method} %{HTTP_URL:url}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:httpversion}))"
HTTP_URL_WITHOUT_PARAMS "(?:%{WORD:method} %{NOTSPACE:url}(?: HTTP/%{NUMBER:httpversion}))"
NO_PARAMS_APACHELOG %{IPV4:ip} %{USERNAME} %{USERNAME} \[%{HTTPDATE:timestamp}\] %{HTTP_URL_WITHOUT_PARAMS} %{NUMBER:response} (?:%{NUMBER:bytes}|-) "%{NOTSPACE:referrer}" %{QS:agent}
PARAMS_APACHELOG %{IPV4:ip} %{USERNAME} %{USERNAME} \[%{HTTPDATE:timestamp}\] %{HTTP_URL_WITH_PARAMS} %{NUMBER:response} (?:%{NUMBER:bytes}|-) "%{NOTSPACE:referrer}" %{QS:agent}

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