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}