logsatsh 使用中多input與output
作中 在配置es的時(shí)候需要對logstash進(jìn)行配置,然而根據(jù)功能分配
input {
log4j {
type => "jpa"
host => "192.168.51.73"
port => 4560
}
log4j {
type => "jpatest"
host => "192.168.51.73"
port => 4567
}
}
output {
stdout {
codec => rubydebug
}
if [type] =="jap"{
elasticsearch{
hosts => ["192.168.51.73:9200"]
index => "logsatsh-jpa-%{+YYYY.MM.dd}"
document_type => "log4jboot_type
}
} else if [type] == "jpatest"{
elasticsearch{
hosts => ["192.168.51.73:9200"]
index => "logsatsh-jpatest-%{+YYYY.MM.dd}"
document_type => "log4jboot_type"
}
}else{
elasticsearch{
hosts => ["192.168.51.73:9200"]
index => "log4jboot-%{+YYYY.MM.dd}"
document_type => "log4jboot_type"
}
}
}
input 從文件中讀取
input{
file{
path => ["D:\Program Files (x86)\apache-tomcat-7.0.69-eclipse\apache-tomcat-7.0.69\logs\zjgqjyError.log"]
type => "zjgqjy_error_file"
start_position => "beginning"
}
}
使用codec+multiline來處理跨行的日志
log4j里面的記錄的java程序發(fā)生異常時(shí)森爽,經(jīng)常 會拋出一大堆異常
在input階段的編碼過程中人灼,加入正則判斷:
input{
file{
path => ["D:\Program Files (x86)\apache-tomcat-7.0.69-eclipse\apache-tomcat-7.0.69\logs\zjgqjyError.log"]
type => "zjgqjy_error_file"
start_position => "beginning"
codec => multiline {
pattern => "(^.+[ERROR]:.+)|(^.+Exception:.+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Causedby:.+)"
what => "previous"
}
}
}
對 multiline 插件來說,有三個(gè)設(shè)置比較重要:negate芙沥、pattern 和 what。
negate
類型是 boolean
默認(rèn)為 false
否定正則表達(dá)式(如果沒有匹配的話)。
pattern
必須設(shè)置
類型為 string
沒有默認(rèn)值
要匹配的正則表達(dá)式胳泉。
what
必須設(shè)置
可以為 previous 或 next
沒有默認(rèn)值
如果正則表達(dá)式匹配了,那么該事件是屬于下一個(gè)或是前一個(gè)事件岩遗?
log4j - logStash - redis - logstash - elasticsearch
# log4j_to_redis
input {
log4j {
type => "jpatest"
host => "192.168.51.73"
port => 4567
}
}
output {
redis {
host => "192.168.51.73" # redis主機(jī)地址
port => 6379 # redis端口號
#db => 8 # redis數(shù)據(jù)庫編號
data_type => list # 使用list模式
key => "logstash_list_jpatest" # 發(fā)布通道名稱
}
}
#redis_to_elasticsearch
input {
redis {
data_type => "list"
key => "logstash_list_jpatest"
host => "192.168.51.73"
port => 6379
threads => 5 #使用多少個(gè)線程去讀
}
}
output {
elasticsearch{
hosts => ["192.168.51.73:9200"]
index => "logsatsh-redis-test-%{+YYYY.MM.dd}"
document_type => "log4jboot_type"
}
}
ogStash::Inputs::Redis 支持三種 data_type(實(shí)際上是redis_type)扇商,不同的數(shù)據(jù)類型會導(dǎo)致實(shí)際采用不同的 Redis 命令操作:
- list => BLPOP
- channel => SUBSCRIBE
- pattern_channel => PSUBSCRIBE
這里我們使用 redis的 list 模式,其他兩種方式是訂閱宿礁、發(fā)布模式案铺, 這種方式在需要擴(kuò)展 logstash 成多節(jié)點(diǎn)集群的時(shí)候,會出現(xiàn)一個(gè)問題:通過頻道發(fā)布的一條信息梆靖,會被所有訂閱了該頻道的 logstash 進(jìn)程同時(shí)接收到控汉,然后輸出重復(fù)內(nèi)容!
Grok 正則捕獲
在 logsatsh 的使用中返吻,對于日志的收集通常需要對對應(yīng)的數(shù)據(jù)進(jìn)行捕獲姑子,將日志格式話,這里需要使用Logstash filter中基于正則的插件gork测僵。
gork 內(nèi)置了120多個(gè)正則街佑, 比如常見的Apache的log格式,Nginx的log格式 上面的正則庫都有成型的正則式捍靠,省去了自己編寫正則一大部分的工作
filter{
grok {
match => { "message" => "client:%{WORD:client},servername:%{WORD:servername}" }
}
}
上面代碼里面的 WORD 就是內(nèi)置的字符串正則沐旨,同樣的還有DATESTAMP_CN,IP,MAC等,通過組合可以將日志格式化剂公,變成json 的格式存儲希俩。
grok {
match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|%{WORD:name}\|Oid: %{WORD:oid}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|%{WORD:result}\|%{GREEDYDATA:exception}\|" }
match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|%{WORD:name}\|Oid: %{WORD:oid}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|%{WORD:result}\|" }
match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|%{WORD:name}\|Oid: %{WORD:oid}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|" }
match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|%{WORD:result}\|" }
match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|" }
remove_field => "message"
}
首先行首使用DATESTAMP_CN規(guī)則來識別時(shí)間,并賦值給logdate字段名纲辽;然后.識別任意字符串(.代表任意一個(gè)字符颜武,包括特殊字符,代表個(gè)數(shù)是任意個(gè))拖吼;然后使用WORD規(guī)則(即匹配字符串規(guī)則鳞上,不包含特殊字符)識別到字符串并賦值給opeType字段;后面同理吊档。這些WORD篙议、IP、GREEDYDATA規(guī)則都是logstash內(nèi)部grok-patterns文件已經(jīng)定義好了的規(guī)則。用戶可以直接拿來使用鬼贱。
remove_field => "message"表示解析完成之后刪除原來的 message字段移怯,避免重復(fù)。
注意:5種正則規(guī)則的上下順序这难,下面的規(guī)則放在上面會導(dǎo)致可能內(nèi)容解析不全舟误,比如源數(shù)據(jù)是:請求交易名|操作員登錄名|操作員編號|ip地址|mac地址|返回結(jié)果|異常信息,如果按照“請求交易名|ip地址|mac地址|”規(guī)則去匹配姻乓,只能識別出3個(gè)字段嵌溢,而且匹配成功,不繼續(xù)往下執(zhí)行蹋岩,這樣識別的內(nèi)容就不全赖草。