環(huán)境:centos6.8、logstash-6.2.4哼凯、主機:192.168.137.60
logstash grok正則表達式參考網站:https://www.missshi.cn/api/view/blog/5ac6dea622890914df000001
(該網站只供參考拭抬,具體應用需查看logstash grok模塊正則文件)
1遇八、安裝logstash
在官網下載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 { } }'
運行起來后隨意輸入字符串觅彰,如:ni hao
下面會打印出相關信息栈雳,其中包含"message" => "ni hao"信息
能夠正確輸出信息證明logstash安裝沒有問題
3、編寫配置文件來啟動logstash(默認logstash的配置文件要自己編寫)
配置文件格式:
# 輸入
????input {
????????? ...
????}
# 過濾器
????filter {
????????? ...
????}
# 輸出
????output {
????????? ...
????}
簡單配置文件示例:
????mkdir /opt/logstash/etc
????cd /opt/logstash/etc
????vi logstash_ceshi.conf
????????input {
????????????stdin { }
????????}
????????output {
????????????stdout { }
????????}
該配置文件表示的是將標準輸入的信息直接傳送給標準輸出
運行該配置文件:/opt/logstash/bin/logstash -f /opt/logstash/etc/logstash_ceshi.conf
運行后可以實現(xiàn)輸入字符串缔莲,然后緊接著輸出含有該字符串信息的輸出內容哥纫,這也是一個最簡單的測試配置文件
????vi logstash_logs.conf
????????input {
????????????file {
????????????????path => "/var/log/messages"
????????????????type => "system"
????????????????start_position => "beginning"
????????????}
????????}
????output {
????????stdout { codec => rubydebug }
????}
該配置文件是將/var/log/messages日志文件的內容作為標準輸入,輸出到標準輸出中痴奏,直接在屏幕顯示
4蛀骇、實驗測試:
編寫配置文件:(讀入本地日志文件,通過正則過濾后將結果輸出給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读拆,配置擅憔,啟動服務
通過配置文件運行l(wèi)ogstash,觀察是否正常輸出過濾后的日志內容
curl http://192.168.137.60:9200/_search?pretty #檢測日志是否正常推送給了elasticsearch
編寫配置文件檐晕,接收filebeat傳送過來的數(shù)據暑诸,通過logstash做數(shù)據刪選,然后傳送給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配置文件常用內容解析:
????input {
????????file {???? #file為常用文件插件辟灰,插件內選項很多个榕,可根據需求自行判斷
????????????path => "/var/lib/mysql/slow.log" ????#要導入的文件的位置,可以使用*芥喇,例如/var/log/nginx/*.log
????????????Excude =>”*.gz” ???? #要排除的文件
????????????start_position => "beginning" ???? #從文件開始的位置開始讀,end表示從結尾開始讀
????????????ignore_older => 0????? #多久之內沒修改過的文件不讀取西采,0為無限制,單位為秒
????????????sincedb_path => "/dev/null" ???? #記錄文件上次讀取位置继控,輸出到null表示每次都從文件首行開始解析
????????????type => "mysql-slow"???? #type字段械馆,可表明導入的日志類型
????????}?
????}
????input {
????????redis { ???? #redis插件為常用插件,插件內選項很多武通,可根據需求自行判斷
????????????batch_count => 1 #EVAL命令返回的事件數(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" #如果有安全認證,此項為認證密碼
????????????db => 0 #如果應用使用了不同的數(shù)據庫冶忱,此為redis數(shù)據庫的編號尾菇,默認為0。
????????????threads => 1 #啟用線程數(shù)量
????????}
????}
????????filter {? ????# 插件很多,這里選取部分插件做講述
????????????if ([message] =~ "正則表達式") {
????????????drop {}
????????}
# 正則匹配=~,!~,包含判斷in,not in 错沽,字符串匹配==,!=,等等簿晓,匹配之后可以做任何操作,這里過濾掉匹配行千埃,除了做過濾操作憔儿,if后面可以作任意操作,甚至可以為匹配到的任意行做單獨的正則分割操作
????????multiline {
????????????pattern => "正則表達式"
????????????negate => true
????????????what => "previous"
????????}
# 多行合并放可,由于一些日志存在一條多行的情況谒臼,這個模塊可以進行指定多行合并,通過正則匹配耀里,匹配到的內容上面的多行合并為一條日志蜈缤。
????????grok {
????????????match => { "message" => "正則表達式" } #正則匹配日志,可以篩選分割出需要記錄的字段和值
????????????remove_field => ["message"] # 刪除不需要記錄的字段
????????? }?
????????date {
????????????match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] #記錄@timestamp時間冯挎,可以設置日志中自定的時間字段底哥,如果日志中沒有時間字段,也可以自己生成
????????????target=>“@timestamp” #將匹配的timestamp字段放在指定的字段 默認是@timestamp
????????}
????????ruby {
????????????code => "event.timestamp.time.localtime" #timestamp時區(qū)鎖定
????????}?
????}
????output {
????????elasticsearch {????? #導出到es房官,最常用的插件
????????????codec => "json" #導出格式為json
????????????hosts => ["127.0.0.1:9200"] #ES地址+端口
????????????index => "logstash-slow-%{+YYYY.MM.dd}" #導出到index內趾徽,可以使用時間變量
????????????user => "admin"
????????????password => "xxxxxx" #ES如果有安全認證就使用賬號密碼驗證,無安全認證就不需要
????????????flush_size => 500 #默認500翰守,logstash一次性攢夠500條的數(shù)據在向es發(fā)送
????????????idle_flush_time => 1 #默認1s孵奶,如果1s內沒攢夠500,還是會一次性把數(shù)據發(fā)給ES
????????}?
????}
????output {
????????redis{????? #輸出到redis的插件蜡峰,下面選項根據需求使用
????????????batch => true #設為false了袁,一次rpush,發(fā)一條數(shù)據湿颅,true為發(fā)送一批
????????????batch_events => 50 #一次rpush發(fā)送多少數(shù)據
????????????batch_timeout => 5 #一次rpush消耗多少時間
????????????codec => plain #對輸出數(shù)據進行codec载绿,避免使用logstash的separate filter
????????????congestion_interval => 1 #多長時間進項一次擁塞檢查
????????????congestion_threshold => 5 #限制一個list中可以存在多少個item,當數(shù)量足夠時肖爵,就會阻塞直到有其他消費者消費list中的數(shù)據
????????????data_type => list #使用list還是publish
????????????db => 0 #使用redis的那個數(shù)據庫卢鹦,默認為0號
????????????host => "127.0.0.1:6379" #redis的地址和端口,會覆蓋全局端口
????????????key => xxx #list或channel的名字
????????????password => xxx #redis的密碼劝堪,默認不使用
????????????port => 6379 #全局端口,默認6379揉稚,如果host已指定秒啦,本條失效
????????????reconnect_interval => 1 #失敗重連的間隔,默認為1s
????????????timeout => 5 #連接超時的時間
????????????workers => 1 #工作進程
????????}
????}