elasticsearch 从URL GROK模式提取参数(子字符串),elasticsearch,logstash,kibana,logstash-grok,elasticsearch,Logstash,Kibana,Logstash Grok" /> elasticsearch 从URL GROK模式提取参数(子字符串),elasticsearch,logstash,kibana,logstash-grok,elasticsearch,Logstash,Kibana,Logstash Grok" />

elasticsearch 从URL GROK模式提取参数(子字符串)

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上的主

我让麋鹿跑去做日志分析。我什么都能用。我只想做一些调整。对于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处理的日期和时间

这是示例条目的外观:

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"
}