環(huán)境:centos6.8、logstash-6.2.4、主機(jī):192.168.137.60
logstash grok正則表達(dá)式參考網(wǎng)站:https://www.missshi.cn/api/view/blog/5ac6dea622890914df000001
(該網(wǎng)站只供參考,具體應(yīng)用需查看logstash grok模塊正則文件)
1、安裝logstash
在官網(wǎng)下載logstash-6.2.4,另外logstash需要依賴java-1.8.0或以上版本,故先安裝java,再安裝logstash
安裝java
? ? yum -y install epel-release
????yum list|grep java(在輸出中尋找java-1.8.0開頭的軟件)
????yum -y install java-1.8.0-*(若yum源中沒有可選擇更新yum源或源碼安裝)
安裝logstash
????mkdir /opt/logstash
????tar -xzf logstash-6.2.4.tar.gz -C /opt/
????mv /opt/logstash-6.2.4 /opt/logstash
解壓該tar包即可直接使用
2、測試logstash
????/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { } }'
運(yùn)行起來后隨意輸入字符串,如:ni hao
下面會(huì)打印出相關(guān)信息,其中包含"message" => "ni hao"信息
能夠正確輸出信息證明logstash安裝沒有問題
3、編寫配置文件來啟動(dòng)logstash(默認(rèn)logstash的配置文件要自己編寫)
配置文件格式:
# 輸入
????input {
????????? ...
????}
# 過濾器
????filter {
????????? ...
????}
# 輸出
????output {
????????? ...
????}
簡單配置文件示例:
????mkdir /opt/logstash/etc
????cd /opt/logstash/etc
????vi logstash_ceshi.conf
????????input {
????????????stdin { }
????????}
????????output {
????????????stdout { }
????????}
該配置文件表示的是將標(biāo)準(zhǔn)輸入的信息直接傳送給標(biāo)準(zhǔn)輸出
運(yùn)行該配置文件:/opt/logstash/bin/logstash -f /opt/logstash/etc/logstash_ceshi.conf
運(yùn)行后可以實(shí)現(xiàn)輸入字符串,然后緊接著輸出含有該字符串信息的輸出內(nèi)容,這也是一個(gè)最簡單的測試配置文件
????vi logstash_logs.conf
????????input {
????????????file {
????????????????path => "/var/log/messages"
????????????????type => "system"
????????????????start_position => "beginning"
????????????}
????????}
????output {
????????stdout { codec => rubydebug }
????}
該配置文件是將/var/log/messages日志文件的內(nèi)容作為標(biāo)準(zhǔn)輸入,輸出到標(biāo)準(zhǔn)輸出中,直接在屏幕顯示
4、實(shí)驗(yàn)測試:
編寫配置文件:(讀入本地日志文件,通過正則過濾后將結(jié)果輸出給elasticsearch)
????input {
????????file {
????????????path => "/opt/logs/nginx_access.log"
????????????type => "access"
????????????start_position => "beginning"
????????}
????}
????filter {
????????grok {
????????????match => {"message" => "%{IP:client}@@%{DATA:time}@@%{WORD:require}@@%{URIPATH:pa}@@%{DATA:version}@@%{NUMBER:stat}@@%{NUMBER:size}@@%{URI:url}@@%{WORD:brow}@@%{IP:server}@@%{NUMBER:time_size}"}
????????????}
????????}
????output {
????????elasticsearch {
????????????codec => "json"
????????????hosts => "192.168.137.60:9200"
????????}
????????stdout { }
????}
編寫腳本生成模擬Apache日志文件:nginx_access.log
安裝elasticsearch,配置,啟動(dòng)服務(wù)
通過配置文件運(yùn)行l(wèi)ogstash,觀察是否正常輸出過濾后的日志內(nèi)容
curl http://192.168.137.60:9200/_search?pretty #檢測日志是否正常推送給了elasticsearch
編寫配置文件,接收filebeat傳送過來的數(shù)據(jù),通過logstash做數(shù)據(jù)刪選,然后傳送給elasticsearch
????input {
????????beats {
????????????host => "192.168.137.60"
????????????port => 5044
????????????type => "beat_type"
????????}
????}
????filter {
????????grok {
????????????match => {"message" => "%{IP:client}@@%{DATA:time}@@%{WORD:require}@@%{URIPATH:pa}@@%{DATA:version}@@%{NUMBER:stat}@@%{NUMBER:size}@@%{URI:url}@@%{WORD:brow}@@%{IP:server}@@%{NUMBER:time_size}"}
????????????}
????????}
????output {
????????elasticsearch {
????????????codec => "json"
????????????hosts => "192.168.137.60:9200"
????????????index => "logstash-slow-%{+YYYY.MM.dd}"
????????}
????????stdout { }
????}
logstash配置文件常用內(nèi)容解析:
????input {
????????file {???? #file為常用文件插件,插件內(nèi)選項(xiàng)很多,可根據(jù)需求自行判斷
????????????path => "/var/lib/mysql/slow.log" ????#要導(dǎo)入的文件的位置,可以使用*,例如/var/log/nginx/*.log
????????????Excude =>”*.gz” ???? #要排除的文件
????????????start_position => "beginning" ???? #從文件開始的位置開始讀,end表示從結(jié)尾開始讀
????????????ignore_older => 0????? #多久之內(nèi)沒修改過的文件不讀取,0為無限制,單位為秒
????????????sincedb_path => "/dev/null" ???? #記錄文件上次讀取位置,輸出到null表示每次都從文件首行開始解析
????????????type => "mysql-slow"???? #type字段,可表明導(dǎo)入的日志類型
????????}?
????}
????input {
????????redis { ???? #redis插件為常用插件,插件內(nèi)選項(xiàng)很多,可根據(jù)需求自行判斷
????????????batch_count => 1 #EVAL命令返回的事件數(shù)目,設(shè)置為5表示一次請求返回5條日志信息
????????????data_type => "list" #logstash redis插件工作方式
????????????key => "logstash-test-list" #監(jiān)聽的鍵值
????????????host => "127.0.0.1" #redis地址
????????????port => 6379 #redis端口號
????????????password => "123qwe" #如果有安全認(rèn)證,此項(xiàng)為認(rèn)證密碼
????????????db => 0 #如果應(yīng)用使用了不同的數(shù)據(jù)庫,此為redis數(shù)據(jù)庫的編號,默認(rèn)為0。
????????????threads => 1 #啟用線程數(shù)量
????????}
????}
????????filter {? ????# 插件很多,這里選取部分插件做講述
????????????if ([message] =~ "正則表達(dá)式") {
????????????drop {}
????????}
# 正則匹配=~,!~,包含判斷in,not in ,字符串匹配==,!=,等等,匹配之后可以做任何操作,這里過濾掉匹配行,除了做過濾操作,if后面可以作任意操作,甚至可以為匹配到的任意行做單獨(dú)的正則分割操作
????????multiline {
????????????pattern => "正則表達(dá)式"
????????????negate => true
????????????what => "previous"
????????}
# 多行合并,由于一些日志存在一條多行的情況,這個(gè)模塊可以進(jìn)行指定多行合并,通過正則匹配,匹配到的內(nèi)容上面的多行合并為一條日志。
????????grok {
????????????match => { "message" => "正則表達(dá)式" } #正則匹配日志,可以篩選分割出需要記錄的字段和值
????????????remove_field => ["message"] # 刪除不需要記錄的字段
????????? }?
????????date {
????????????match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] #記錄@timestamp時(shí)間,可以設(shè)置日志中自定的時(shí)間字段,如果日志中沒有時(shí)間字段,也可以自己生成
????????????target=>“@timestamp” #將匹配的timestamp字段放在指定的字段 默認(rèn)是@timestamp
????????}
????????ruby {
????????????code => "event.timestamp.time.localtime" #timestamp時(shí)區(qū)鎖定
????????}?
????}
????output {
????????elasticsearch {????? #導(dǎo)出到es,最常用的插件
????????????codec => "json" #導(dǎo)出格式為json
????????????hosts => ["127.0.0.1:9200"] #ES地址+端口
????????????index => "logstash-slow-%{+YYYY.MM.dd}" #導(dǎo)出到index內(nèi),可以使用時(shí)間變量
????????????user => "admin"
????????????password => "xxxxxx" #ES如果有安全認(rèn)證就使用賬號密碼驗(yàn)證,無安全認(rèn)證就不需要
????????????flush_size => 500 #默認(rèn)500,logstash一次性攢夠500條的數(shù)據(jù)在向es發(fā)送
????????????idle_flush_time => 1 #默認(rèn)1s,如果1s內(nèi)沒攢夠500,還是會(huì)一次性把數(shù)據(jù)發(fā)給ES
????????}?
????}
????output {
????????redis{????? #輸出到redis的插件,下面選項(xiàng)根據(jù)需求使用
????????????batch => true #設(shè)為false,一次rpush,發(fā)一條數(shù)據(jù),true為發(fā)送一批
????????????batch_events => 50 #一次rpush發(fā)送多少數(shù)據(jù)
????????????batch_timeout => 5 #一次rpush消耗多少時(shí)間
????????????codec => plain #對輸出數(shù)據(jù)進(jìn)行codec,避免使用logstash的separate filter
????????????congestion_interval => 1 #多長時(shí)間進(jìn)項(xiàng)一次擁塞檢查
????????????congestion_threshold => 5 #限制一個(gè)list中可以存在多少個(gè)item,當(dāng)數(shù)量足夠時(shí),就會(huì)阻塞直到有其他消費(fèi)者消費(fèi)list中的數(shù)據(jù)
????????????data_type => list #使用list還是publish
????????????db => 0 #使用redis的那個(gè)數(shù)據(jù)庫,默認(rèn)為0號
????????????host => "127.0.0.1:6379" #redis的地址和端口,會(huì)覆蓋全局端口
????????????key => xxx #list或channel的名字
????????????password => xxx #redis的密碼,默認(rèn)不使用
????????????port => 6379 #全局端口,默認(rèn)6379,如果host已指定,本條失效
????????????reconnect_interval => 1 #失敗重連的間隔,默認(rèn)為1s
????????????timeout => 5 #連接超時(shí)的時(shí)間
????????????workers => 1 #工作進(jìn)程
????????}
????}