1.logstash的概念及特點。
概念:logstash是一個數據采集、加工處理以及傳輸(輸出)的工具。
特點:
- 所有類型的數據集中處理
- 不同模式和格式數據的正常化
- 自定義日志格式的迅速擴展
- 為自定義數據源輕松添加插件
2.logstash安裝配置。
①.下載安裝
[root@node1 ~]# wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.3.4-1.noarch.rpm
[root@node1 ~]# rpm -ivh logstash-2.3.4-1.noarch.rpm
②.簡單測試logstash,啟動后輸入"hello,xkops"。
[root@node1 ~]# /opt/logstash/bin/logstash -e 'input{ stdin{} } output{ stdout{} }'
*提示:如果輸出"hello,xkops",則證明logstash啟動成功。
③.以服務啟動方式。
[root@node1 ~]# service logstash start
總結:logstash三種啟動方式,-e sting類型啟動,-f 指定配置文件啟動,服務啟動。
3.logstash配置語句詳解。
logstash配置文件包含三個配置部分,分別為:input{}、filter{}、output{}。
{} 定義區域,區域內可以定義一個或多個插件,通過插件對數據進行收集,加工處理,輸出。
數據類型:
布爾值類型: ssl_enable => true
字節類型: bytes => "1MiB"
字符串類型: name => "xkops"
數值類型: port => 22
數組: match => ["datetime","UNIX"]
哈希: options => {key1 => "value1",key2 => "value2"}
編碼解碼: codec => "json"
路徑: file_path => "/tmp/filename"
注釋: #
條件判斷:
等於: ==
不等於: !=
小於: <
大於: >
小於等於: <=
大於等於: >=
匹配正則: =~
不匹配正則: !~
包含: in
不包含: not in
與: and
或: or
非與: nand
非或: xor
復合表達式: ()
取反符合: !()
4.logstash常用插件。
類型:
input類:也就是在input區域內定義使用的插件。
codec類:定於處理數據格式,如plain,json,json_lines等格式。這個可以定義在input、output區域中。
filter類:也就是在filter區域內定義使用的插件。
output類:也就是在output區域內定義使用的插件。
各類插件地址:https://github.com/logstash-plugins
----------------------input類插件-------------------------------
input類插件,常用的插件:file、tcp、udp、syslog,beats等。
①.file插件:
file插件字段解釋:
codec => #可選項,默認是plain,可設置其他編碼方式。
discover_interval => #可選項,logstash多久檢查一下path下有新文件,默認15s。
exclude => #可選項,排除path下不想監聽的文件。
sincedb_path => #可選項,記錄文件以及文件讀取信息位置的數據文件。~/.sincedb_xxxx
sincedb_write_interval => #可選項,logstash多久寫一次sincedb文件,默認15s.
stat_interval => #可選項,logstash多久檢查一次被監聽文件的變化,默認1s。
start_position => #可選項,logstash從哪個位置讀取文件數據,默認從尾部,值為:end。初次導入,設置為:beginning。
path => #必選項,配置文件路徑,可定義多個。
tags => #可選項,在數據處理過程中,由具體的插件來添加或者刪除的標記。
type => #可選項,自定義處理時間類型。比如nginxlog。
實例:
[root@node1 conf.d]# cat /tmp/file{1,2}.log
This is test file-plugin in file1.log
This is test file-plugin in file2.log
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat file.conf
input{ file{ start_position => "beginning" path => ["/tmp/file1.log","/tmp/file2.log"] type => 'filelog' } } output{ stdout{} }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f file.conf -t
Configuration OK
[root@node1 conf.d]# /opt/logstash/bin/logstash -f file.conf
Settings: Default pipeline workers: 1
Pipeline main started
2016-07-16T02:50:07.410Z node1 This is test file-plugin in file1.log
2016-07-16T02:50:07.428Z node1 This is test file-plugin in file2.log
*提示:能夠輸出內容則證明file插件正常工作。
②.tcp插件:
tcp插件字段解釋:
add_field => #可選項,默認{}。
codec => #可選項,默認plain。
data_timeout => #可選項,默認-1。
host => #可選項,默認0.0.0.0。
mode => #可選項,值為["server","client"]之一,默認為server。
port => #必選,端口。
ssl_cacert => #可選項,定義相關路徑。
ssl_cert => #可選項,定義相關路徑。
ssl_enable => #可選項,默認為false。
ssl_key => #可選項,定義相關路徑。
ssl_key_passphrase => #可選項,默認nil
ssl_verify => #可選項,默認false。
tags => #可選項
type => #可選項
實例:
[root@node1 conf.d]# cat /tmp/tcp.log
this is test tcp-plugin in tcp.log
send tcplog data
output tcplog data
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat tcp.conf
input{ tcp{ host => "127.0.0.1" port => 8888 type => "tcplog" } } output{ stdout{} }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f tcp.conf
此時開啟另個終端,使用nc開啟一個tcp端口8888,並將數據推送到8888端口。
[root@node1 conf.d]# nc 127.0.0.1 8888 < /tmp/tcp.log
*提示:前一個終端如果出現數據,則證明tcp插件工作正常。
③udp插件:
udp插件字段解釋:
add_field => #可選項,默認{}。
host => #可選項,默認0.0.0.0。
queue_size => #默認2000
tags => #可選項
type => #可選項
workers => #默認為2
實例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat udp.conf
input{ udp{ host => "127.0.0.1" port => 9999 } } output{ stdout{} }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f udp.conf
打開另一終端執行如下腳本,並輸入內容:"hello,udplog"。
[root@node1 conf.d]# cat /tmp/udpclient.py
#/usr/bin/env python import socket host = "127.0.0.1" port = 9999 file_input = raw_input("Please input udp log: ") s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.sendto(file_input,(host,port))
*提示:如果前一個終端收到日志,則證明udp插件工作正常。
④.syslog插件:
實例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat syslog.conf
input{ syslog{ host => "127.0.0.1" port => 518 type => "syslog" } } output{ stdout{} }
[root@node1 conf.d]# echo '*.* @@127.0.0.1:518' >> /etc/rsyslog.conf
[root@node1 conf.d]# /etc/init.d/rsyslog restart
關閉系統日志記錄器: [確定]
啟動系統日志記錄器: [確定]
[root@node1 conf.d]# /opt/logstash/bin/logstash -f syslog.conf
使用logger命令向系統寫入日志:
[root@node1 conf.d]# logger
*提示:此處隨便輸入內容,查看前一個終端是否會有內容輸出,如果輸出則證明syslog插件工作正常。
--------------------------codec類插件------------------------------------
codec類插件,常用的插件:plain、json、json_lines、rubydebug、multiline等。
①.plain插件:
實例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat plain.conf
input{ stdin{ codec => "plain" } } output{ stdout{} }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f plain.conf
輸入信息查看輸出。
②.json插件:
實例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat json.conf
input{ stdin{} } output{ stdout{ codec => "json" } }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f json.conf
輸入信息查看輸出。
③.json_lines插件:(json文本過長時使用)
實例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat jsonlines.conf
input{ tcp{ host => "127.0.0.1" port => 8888 codec => "json_lines" } } output{ stdout{} }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f jsonlines.conf
啟動一個新的終端,執行如下命令。
[root@node1 conf.d]# cat /tmp/jsonlines.txt
You run a price alerting platform which allows price-savvy customers to specify a rule like "I am interested in buying a specific electronic gadget and I want to be notified if the price of gadget falls below $X from any vendor within the next month". In this case you can scrape vendor prices, push them into Elasticsearch and use its reverse-search (Percolator) capability to match price movements against customer queries and eventually push the alerts out to the customer once matches are found.
[root@node1 conf.d]# nc 127.0.0.1 8888 < /tmp/jsonlines.txt
*提示:觀察前一個終端的輸出,如果正常輸出,則json_lines插件工作正常。
④.rubedebug插件:
實例:
[root@node1 conf.d]# cat rubydebug.conf
input{ stdin{ codec => "json" } } output{ stdout{ codec => "rubydebug" } }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f rubydebug.conf
輸入json串查看輸出效果。
json串:{"name":"xkops","age":"25"}
⑤.multiline插件:(處理錯誤日志)
multiline插件字段:
charset => #字符編碼,可選
max_bytes => #bytes類型,設置最大的字節數,可選
max_lines => #number類型,設置最大的行數,默認是500行,可選
multiline_tag => #string類型,設置一個事件標簽,默認是"multiline" ,可選
pattern => #string 類型,設置匹配的正則表達式 ,必選
patterns_dir => #array類型,可以設置多個正則表達式,可選
negate => #boolean類型,設置正向匹配還是反向匹配,默認是false,可選
what => #設置未匹配的內容是向前合並還是向后合並,previous, next 兩個值選擇,必選
錯誤日志:
[16-07-2016 22:54:01] PHP warning: unknown exception in /xxx/test/index.php:99
111111111111111111
222222222222222222
[16-07-2016 23:19:43] PHP warning: unknown exception in /xxx/test/index.php:93
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat codecmultilines.conf
input{ stdin{ codec => multiline{ pattern => "^\[" negate => true what => "previous" } } } output{ stdout{} }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f codecmultilines.conf
*提示:輸入上述錯誤日志查看輸出。
---------------------filter類插件---------------------------------------------
filter插件,常用的filter插件:json、grok等。
①.json插件:
add_field => #hash(可選項),默認{}
add_tag => #array(可選項),默認[]
remove_field => #array(可選項),默認[]
remove_tag => #array(可選項),默認[]
source => #string(必選項)
target => #string(可選項)
實例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat filterjson.conf
input{ stdin{} } filter{ json{ source => "message" #target => "content" } } output{ stdout{ codec => "rubydebug" } }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f filterjson.conf
輸入兩個串,查看輸出。
{"name":"xkops","age":"25"}
name xkops
②.grok插件:解析各種非結構化的日志數據插件。
grok有豐富的patterns,查看方式:
cat /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
實例:
輸入的元數據內容:
20.3.1.3 GET /xkops/index.html 8838 1.323
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat filtergrok.conf
input{ stdin{} } filter{ grok{ match => ["message","%{IP:ip} %{WORD:method} %{URIPATH:uri} %{NUMBER:bytes} %{NUMBER:duration}"] } } output{ stdout{ codec => "rubydebug" } }
[root@node1 conf.d]# /opt/logstash/bin/logstash -f filtergrok.conf
*提示:輸入上述元數據查看輸出。
*提示:grok在線工具使用:https://grokdebug.herokuapp.com/
③.kv插件: 解析處理key-value鍵值對數據
--------------------output類插件-----------------------------
output插件:
①.file插件
②.tcp/udp插件
③.redis/kfaka
④.elasticsearch
附錄:
redis配置:
input{ redis{ host => 'redis-server' port => '6379' data_type => 'list' key => 'lb' codec => 'json' } }