将grok应用于日志文件

时间:2016-02-23 06:43:11

标签: elasticsearch logstash grok

我是Grok和logstash的新手。

2016/02/18 - 03:52:08|service|Info|some message in different format
2016/02/18 - 03:52:08|service|Info|Time to process "tweet_name" is 40.1081357 second(s)

我会收到上述格式的消息。我想要的是,我想提取以下内容,

  1. datetime
  2. 服务
  3. loglevel
  4. 消息
  5. tweetname
  6. timetoprocess
  7. 只有当邮件以Time to process

    开头时,才能使用第5项和第6项

    我写了一个grok,但我不知道如何提取第5项和第6项。因为#5和#6只能在特定的日志消息行中使用。

    filter {grok { match => { "message" => "(?<datetime>(([0-9]+)\/*)+ - ([0-9]+:*)+)\|%{WORD:service}\|%{WORD:loglevel}\|%{GREEDYDATA:message}" }}}
    

    如何获得第5项和第6项并应用grok?

2 个答案:

答案 0 :(得分:1)

我建议使用两个grok节。首先,拉掉常见的东西(你的#1-#3)。使用&#39;覆盖&#39;将剩余的内容重新放回[消息]中。 grok {}的参数。这与您提供的grok中的内容非常相似,但如果您使用内置模式,例如%{YEAR}

,它会更清晰

然后,使用带匹配模式的第二个grok节来处理剩下的其他类型的值。像这样:

grok {
    match => { "message" => "Time to process \"%{DATA:tweet_name}\" is %{NUMBER:tweet_sec} second\(s\)" }
}

如果您还有其他要创建字段的消息,请在grok节中添加更多模式。它将按顺序处理它们,直到找到匹配然后退出。

答案 1 :(得分:0)

您必须为不同的消息添加新的grok。             它将按顺序处理它们,在匹配正确的模式后退出。