Grok 重新创建时间戳和消息

Grok recreate timestamp and message

我正在尝试为以下格式创建 grok 模式:

October 27, 2015 03:44: lorem created a new project "lorem / ipsum"
October 27, 2015 03:48: lorem created a new project "lorem / ipsum-cp"
October 27, 2015 18:38: john created a new project "john / playgroud"
October 27, 2015 18:42: joseph created a new project "joseph / test-ci"

我找不到与完整日期匹配的单个表达式,因此我执行了以下操作:

grok {
    match => { "message" => "%{MONTH:month}%{SPACE}%{NUMBER:day}, %{YEAR:year}%{SPACE}%{HOUR:hour} %{NUMBER:minute}"}
}

从而为日期时间戳的所有部分创建一组字段。现在我在想什么是处理该行其余部分和重新创建时间戳的最佳方法。

我正在考虑使用 mutate 将所有字段连接在一起并通过日期过滤器对其进行解析,但我是否应该将 message 参数重写为该行的其余部分?喜欢 lorem created a new project "lorem / ipsum" 还是保持原样以反映原始行?

要将行的其余部分放入字段中,请在模式末尾使用 GREEDYDATA:

 %{GREEDYDATA:remainder}

由于我将前导数据放入一个新字段,我通常会将剩余数据放回 'message' 字段:

 %{GREEDYDATA:message}

这还需要在 grok{} 上设置 'overwrite' 参数。

有几种方法可以获取单个日期。正如您所建议的那样,将它们合并到 logstash 中:

mutate {
   add_field => {
      "myDateField" => "%{myMonth} %{myDay} %{myYear}"
   }
}

那么您需要一个匹配模式的日期{}过滤器。

如果您只想要一个日期字段,那么没有理由制作所有的小字段(月、日、年)。使用 grok 模式将你想要的所有内容都拉到一个字段中:

^(?<myDateField>[^:]+):

("from the beginning of the line, everything that's not a colon goes into a field called myDateField")

另一条评论:如果模式之间总是只有一个 space,请不要使用 %{SPACE}。这样更容易阅读:

%{YEAR:year} %{HOUR:hour}

不过,如果您可能有多个 space 或其他类型的白色 space,那么请务必使用 %{SPACE}。