日志分析logstash插件
一般系统或服务生成的日志都是一大长串。每个字段之间用空格隔开。logstash在获取日志是整个一串获取,如果把日志中每个字段代表的意思分割开来在传给elasticsearch。这样呈现出来的数据更加清晰,而且也能让kibana更方便的绘制图形。Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。
grok表达式
下面针对Apache日志来分割处理
filter {
if == "apache" {
grok {
match => ["message" => "%{IPORHOST:addre} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} (?:%{NUMBER:bytes}|-) \"(?:%{URI:http_referer}|-)\" \"%{GREEDYDATA:User_Agent}\""]
remove_field => ["message"]
}
date {
match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
}
}
} 下面是apache日志
192.168.10.97 - - "GET / HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
日志中每个字段之间空格隔开,分别对应message中的字段。
如:%{IPORHOST:addre}--> 192.168.10.197
但问题是IPORHOST又不是正则表达式,怎么能匹配IP地址呢?
因为IPPRHOST是grok表达式,它代表的正则表达式如下:
IPV6 ((({1,4}:){7}({1,4}|:))|(({1,4}:){6}(:{1,4}|((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3})|:))|(({1,4}:){5}(((:{1,4}){1,2})|:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3})|:))|(({1,4}:){4}(((:{1,4}){1,3})|((:{1,4})?:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(({1,4}:){3}(((:{1,4}){1,4})|((:{1,4}){0,2}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(({1,4}:){2}(((:{1,4}){1,5})|((:{1,4}){0,3}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(({1,4}:){1}(((:{1,4}){1,6})|((:{1,4}){0,4}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(:(((:{1,4}){1,7})|((:{1,4}){0,5}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:)))(%.+)?
IPV4 (? "/usr/local/logstash-2.3.4/ownpatterns/patterns"
match => {
"message" => "%{APACHE_LOG}"
}
remove_field => ["message"]
}
date {
match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
}
}
} patterns_dir为自定义的grok表达式的路径。
自定义的patterns中按照logstash自带的格式书写。
APACHE_LOG %{IPORHOST:addre} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} (?:%{NUMBER:bytes}|-) \"(?:%{URI:http_referer}|-)\" \"%{GREEDYDATA:User_Agent}\"
我只是把apache日志匹配的grok表达式写入自定义文件中,简化conf文件。单个字段的正则表达式匹配你可以自己书写测试。
参考:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
页:
[1]