一、什么是Logstash
Logstash是一個開源的、接受來自多種數據源(input)、過濾你想要的數據(filter)、存儲到其他設備的日志管理程序。Logstash包含三個基本插件input\filter\output,一個基本的logstash服務必須包含input和output.
Logstash如何工作:
Logstash數據處理有三個階段,input–>filter–>output.input生產數據,filter根據定義的規則修改數據,output將數據輸出到你定義的存儲位置。
Inputs:
數據生產商,包含以下幾個常用輸出:
-
file: 從文件系統中讀取文件,類似使用tail -0F
-
syslog: syslog服務,監聽在514端口使用RFC3164格式
-
redis: 從redis服務讀取,使用redis管道和列表。
-
beats: 一種代理,自己負責收集好數據然后轉發給Logstash,常用的如filebeat.
Filters:
filters相當一個加工管道,它會一條一條過濾數據根據你定義的規則,常用的filters如下:
-
grok: 解析無規則的文字並轉化為有結構的格式。
-
mutate: 豐富的基礎類型處理,包括類型轉換、字符串處理、字段處理等。
-
drop: 丟棄一部分events不進行處理,例如: debug events
-
clone: 負責一個event,這個過程中可以添加或刪除字段。
-
geoip: 添加地理信息(為前台kibana圖形化展示使用)
Outputs:
-
elasticserache elasticserache接收並保存數據,並將數據給kibana前端展示。
-
output 標准輸出,直接打印在屏幕上。
二、Logstash的安裝配置
Logstash運行僅僅依賴java運行環境(jre),JDK版本1.8以上即可。直接從ELK官網下載Logstash:https://www.elastic.co/cn/products
1 # tar -zxvf logstash-6.1.0.tar.gz 2 # cd logstash-6.1.0
現在我們來運行一下一個簡單的例子:
1 # bin/logstash -e 'input { stdin { } } output { stdout {} }'
我們現在可以在命令行下輸入一些字符,然后我們將看到logstash的輸出內容:
1 hello world 2 2017-11-21T01:22:14.405+0000 0.0.0.0 hello world
Ok,還挺有意思的吧… 以上例子我們在運行logstash中,定義了一個叫”stdin”的input還有一個”stdout”的output,無論我們輸入什么字符,Logstash都會按照某種格式來返回我們輸入的字符。這里注意我們在命令行中使用了-e參數,該參數允許Logstash直接通過命令行接受設置。這點尤其快速的幫助我們反復的測試配置是否正確而不用寫配置文件。
讓我們再試個更有意思的例子。首先我們在命令行下使用CTRL-C命令退出之前運行的Logstash。現在我們重新運行Logstash使用下面的命令:
1 # bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
我們再輸入一些字符,這次我們輸入”hello world ”:
1 hello world2 { 3 "message" => "hello world", 4 "@timestamp" => "2017-11-20T23:48:05.335Z", 5 "@version" => "1", 6 "host" => "node1" 7 }
以上示例通過重新設置了叫”stdout”的output(添加了”codec”參數),我們就可以改變Logstash的輸出表現。類似的我們可以通過在你的配置文件中添加或者修改inputs、outputs、filters,就可以使隨意的格式化日志數據成為可能,從而訂制更合理的存儲格式為查詢提供便利。
前面已經說過Logstash必須有一個輸入和一個輸出,上面的例子表示從終端上輸入並輸出到終端。
數據在線程之間以事件的形式流傳。不要叫行,因為Logstash可以處理多行事件。
input {
# 輸入域,可以使用上面提到的幾種輸入方式。stdin{} 表示標准輸入,file{} 表示從文件讀取。
input的各種插件: https://www.elastic.co/guide/en/logstash/current/input-plugins.html
}
output {
#Logstash的功能就是對數據進行加工,上述例子就是Logstash的格式化輸出,當然這是最簡單的。
output的各種插件:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
}
Logstash配置文件和命令:
Logstash的默認配置已經夠我們使用了,從5.0后使用logstash.yml文件,可以將一些命令行參數直接寫到YAML文件即可。
-
–configtest 或 -t 用於測試Logstash的配置語法是否正確,非常好的一個參數。
-
–log 或 -l Logstash默認輸出日志到標准輸出,指定Logstash的日志存放位置
-
–pipeline-workers 或 -w 指定運行filter和output的pipeline線程數量,使用默認就好。
-
-f 指定規則文件,可以將自己的文件放在同一個路徑下,使用-f 即可運行。
一個簡單的Logstash從文件中讀取配置
1 vim file.conf #file.conf可以放在任意位置 2 input { 3 stdin { 4 } 5 } 6 output { 7 stdout { 8 codec=>rubydebug 9 } 10 } 11 ~ 12 bin/logstash -f /root/conf/file.conf #啟動即可
三、一些常用的插件
1、grok插件
Grok是Logstash最重要的插件,你可以在grok里自定義好命名規則,然后在grok參數或者其他正則表達式中引用它。
官方給出了120個左右默認的模式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
1 USERNAME [a-zA-Z0-9._-]+ 2 USER %{USERNAME}
第一行,用普通的正則表達式來定義一個grok表達式;第二行,通過打印賦值格式,用前面定義好的grok表達式來定義里一個grok表達式。
正則表達式引格式:
1 %{SYNTAX:SEMANTIC}
-
SYNTAX:表示你的規則是如何被匹配的,比如3.14將會被NUMBER模式匹配,55.1.1.2將會被IP模式匹配。
-
SEMANTIC:表示被匹配到的唯一標識符,比如3.14被匹配到了后,SEMANTIC就當是3.14。
匹配到的數據默認是strings類型,當然你也可以裝換你匹配到的數據,類似這樣:
1 %{NUMBER:num:int}
當前只支持裝換為int和float。
例如:
1 filter { 2 grok { 3 match => { 4 "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}" 5 } 6 } 7 }
1 jasi 12.12 asioa 2 { 3 "@timestamp" => 2017-02-08T05:55:18.460Z, 4 "request_time" => 12.12, 5 "@version" => "1", 6 "host" => "0.0.0.0", 7 "message" => "jasi 12.12 asioa" 8 }
這個我們就匹配到我們想要的值了,並將名字命名為:request_time
在實際生產中為了方便我們不可能在配置文件中一行一行的寫表達式,建議把所有的grok表達式統一寫到一個地方,使用patterns_dir選項來引用。
1 grok { 2 patterns_dir => "/root/conf/nginx" #這是你定義的grok表達式文件 3 match => { "message" => "%{CDN_FORMAT}" } 4 add_tag => ["CDN"] 5 }
事實上,我們收集的日志也有很多不需要的地方,我們可以刪除一部分field信息,保留我們想要的那一部分。
1 grok { 2 match => { 3 "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}" 4 } 5 remove_field => [ "request_time" ] 6 overwrite => [ "message" ] 7 } 8 as 12 as 9 { 10 "@timestamp" => 2017-02-08T06:39:07.921Z, 11 "@version" => "1", 12 "host" => "0.0.0.0", 13 "message" => "as 12 as" 14 }
已經沒有request_time這個field啦~
更多關於grok的用戶看官方文檔:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
最重要的一點:我強烈建議每個人都要使用 Grok Debugger 來調試自己的 grok 表達式。
2、kv插件
在很多的情況下,日志類容本身就是類似於key-value的格式,kv插件就是自動處理類似於key=value樣式的數據。
kv { source => "request" #數據來源,默認是message field_split => "&" # 用於分割鍵值對 value_split => "=" # 識別鍵值對的關系,如 k1:v1 k2:v2 ":"即為鍵值對關系連接符 }
3、geoip插件
geoip主要是查詢IP地址歸屬地,用來判斷訪問網站的來源地。
1 geoip { 2 source => "clientip" 3 fields => [ "ip","city_name","country_name","location" ] #fields包含信息太多,可以自定義 4 }
Logstash還有許多比較常用的插件,如json\multiline等,可以到官方文檔查看。
轉自:https://www.busyboy.cn/?p=988