elasticsearch 从URL GROK模式提取参数(子字符串)
我让麋鹿跑去做日志分析。我什么都能用。我只想做一些调整。对于stackoverflow的所有ES/麋鹿神,我非常感谢在这方面的任何帮助。我很乐意请你喝杯咖啡D 例如: URL:/origina-www.domain.com/this/is/a/path?page=2 首先,我想得到如上所示的整个路径 其次,我想得到参数:/origina-www.domain.com/this/is/a/path之前的路径 第三,我只想得到参数:?page=2 第四,我想让日志文件上的时间戳成为kibana上的主要时间戳。目前,kibana显示的时间戳是ES处理的日期和时间 这是示例条目的外观:elasticsearch 从URL GROK模式提取参数(子字符串),elasticsearch,logstash,kibana,logstash-grok,elasticsearch,Logstash,Kibana,Logstash Grok,我让麋鹿跑去做日志分析。我什么都能用。我只想做一些调整。对于stackoverflow的所有ES/麋鹿神,我非常感谢在这方面的任何帮助。我很乐意请你喝杯咖啡D 例如: URL:/origina-www.domain.com/this/is/a/path?page=2 首先,我想得到如上所示的整个路径 其次,我想得到参数:/origina-www.domain.com/this/is/a/path之前的路径 第三,我只想得到参数:?page=2 第四,我想让日志文件上的时间戳成为kibana上的主
2016-10-19 23:57:32 192.168.0.1 GET /origin-www.example.com/url 200 1144 0 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-" "-"
这是我的配置:
if [type] == "syslog" {
grok {
match => ["message", "%{IP:client}\s+%{WORD:method}\s+%{URIPATHPARAM:request}\s+%{NUMBER:bytes}\s+%{NUMBER:duration}\s+%{USER-AGENT}\s+%{QS:referrer}\s+%{QS:agent}%{GREEDYDATA}"]
}
date {
match => [ "timestamp", "MMM dd, yyyy HH:mm:ss a" ]
locale => "en"
}
}
ES版本:5.0.1
日志存储版本:5.0
基巴纳:5.0
更新:我实际上能够通过以下方法解决此问题:
grok {
match => ["message", "%{IP:client}\s+%{WORD:method}\s+%{URIPATHPARAM:request}\s+%{NUMBER:bytes}\s+%{NUMBER:duration}\s+%{USER-AGENT}\s+%{QS:referrer}\s+%{QS:agent}%{GREEDYDATA}"]
}
grok {
match => [ "request", "%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}" ]
}
kv {
source => "uri_query"
field_split => "&"
target => "query"
}
为了使用日志条目的实际
时间戳
,而不是索引时间,您可以使用日期
和变异
插件来覆盖现有的时间戳
值。您可以让您的logstash
过滤器看起来像这样:
//filtering your log file
grok {
patterns_dir => ["/pathto/patterns"] <--- you could have a pattern file with such expression LOGTIMESTAMP %{YEAR}%{MONTHNUM}%{MONTHDAY} %{TIME} if you have to change the timestamp format.
match => { "message" => "^%{LOGTIMESTAMP:logtimestamp}%{GREEDYDATA}" }
}
//overriding the existing timestamp with the new field logtimestamp
mutate {
add_field => { "timestamp" => "%{logtimestamp}" }
remove_field => ["logtimestamp"]
}
//inserting the timestamp as UTC
date {
match => [ "timestamp" , "ISO8601" , "yyyyMMdd HH:mm:ss.SSS" ]
target => "timestamp"
locale => "en"
timezone => "UTC"
}
//筛选日志文件
格罗克{
patterns_dir=>[“/pathto/patterns”]{“message”=>“^%{LOGTIMESTAMP:LOGTIMESTAMP}%{GREEDYDATA}”
}
//使用新字段logtimestamp覆盖现有时间戳
变异{
add_field=>{“timestamp”=>“%{logtimestamp}”}
删除_字段=>[“logtimestamp”]
}
//将时间戳插入为UTC
日期{
匹配=>[“时间戳”、“ISO8601”、“yyyyMMdd HH:mm:ss.SSS”]
目标=>“时间戳”
语言环境=>“en”
时区=>“UTC”
}
你也可以进一步跟进。希望能有所帮助。kv是我的建议,您应该将您的解决方案作为自我回答发布,以帮助其他人解决类似问题future@WillBarnwell我该怎么做?我是新来的,还在学习它是如何工作的。:)顺便说一句,@WillBarnwell我还有最后一个问题,第四个问题是关于更改kibana的时间戳,以使用每个日志条目的实际时间和日期。也许你能帮我解决这个问题?:)非常感谢,因为我正在学习ES的诀窍。日期:您可以使用时间戳_ISO8601模式获取
2016-10-19 23:57:32
字符串。然后你可以使用这个模式的日期过滤器:“YYYY-MM-dd HH:MM:ss”太棒了!谢谢你DGlad:它有帮助:)
grok {
match => ["message", "%{IP:client}\s+%{WORD:method}\s+%{URIPATHPARAM:request}\s+%{NUMBER:bytes}\s+%{NUMBER:duration}\s+%{USER-AGENT}\s+%{QS:referrer}\s+%{QS:agent}%{GREEDYDATA}"]
}
grok {
match => [ "request", "%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}" ]
}
kv {
source => "uri_query"
field_split => "&"
target => "query"
}