filter
(1)json filter
数据格式是JSON,那么可以通过它吧数据解析成你想要的数据结构
json 设置参数
filter{
json {
add_filed =>..... #hash(可选项),默认,#意思就是添加字段
add_tag =>..... #array(可选项)
remove_field
remove_tag
source=> #string(必选),这是指定来源数据,一般都是message
target => #string,定义将要解析的目标字段
}
}
例子:
input{
stdin {}
}
filter {
json{
source =>"message"
}
}
output {
stdout {codec =>rubydebug}
}
grok filter
gork 是目前logstash里最好的一种解析各种非结构化的日志数据的工具
官方的patterns地址:https://github.com/elastic/logstash/tree/v1.4.2/patterns
grok的例子:
现在又日志格式:
10.2.3.3 - - [22/Jul/2016:16:07:28 +0800] "GET /img/icon_pop_stop.png HTTP/1.0" 200 5071
input {
file {
path => ["/etc/httpd/logs/h5.yizhenmoney.com-access_log"]
}
}
filter {
grok {
match => {"message"=>"%{IP:client_ip} - - \[%{HTTPDATE:timestamp}\] \":?%{WORD:http_verb} %{URIPATH:url_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} :?%{NUMBER:bytes}"}
remove_field => ["message"] #这个remove_field的作用是移除你不想让让出现的字段,这样的话,在kibana的显示页面上就不显示message这个字段的内容了
}
}
output {
elasticsearch {
hosts => ["192.168.220.116:9200"]
index => "h5-access-%{+YYYY.MM.dd}"
}
}
还有就是在日常工作中官方提供的匹配规则不一定适合你的生产环境,这时候,你可以自己写patterns
filter {
grok {
patterns_dir => ["/you_path/patterns(这里写上patterns的绝对路径)"]
match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
}
}
filter {
grok {
match => {"message"=>"%{IP:client_ip} - -
\[%{HTTPDATE:timestamp}\] \":?%{WORD:http_verb} %{URIPATH:url_path}
HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} :?%{NUMBER:bytes}"},
match => {"message"=>"%{IP:client_ip} - - \[%{HTTPDATE:timestamp}\] \":?%{WORD:http_verb} %{URIPATH:url_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} :?%{NUMBER:bytes}"},
match => {"message"=>"%{IP:client_ip} - - \[%{HTTPDATE:timestamp}\] \":?%{WORD:http_verb} %{URIPATH:url_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} :?%{NUMBER:bytes}"}
}
}
还有就是多规则的匹配,因为一个日志文件里的内容的格式不一定是一致的,这个时候我们就要多条匹配规则了,多条匹配规则之间用逗号隔开