13

我有一个 drupal 看门狗 syslog 文件,我想将其解析为两个嵌套字段,即 syslog 部分和消息部分,以便得到这个结果

syslogpart: {
  timestamp: "",
  host: "",
  ...
},
messagepart:{
  parsedfield1: "",
  parsedfield2: "",
  ...
}

我尝试制作如下所示的自定义模式:

DRUPALSYSLOG (%{SYSLOGTIMESTAMP:date} %{SYSLOGHOST:logsource} %{WORD:program}: %{URL:domain}\|%{EPOCH:epoch}\|%{WORD:instigator}\|%{IP:ip}\|%{URL:referrer}\|%{URL:request}\|(?<user_id>\d+)\|\|)

然后运行match => ['message', '%{DRUPALSYSLOG:drupal}'}

但我没有得到嵌套响应,我得到一个文本块drupal: "ALL THE MATCHING FIELDS IN ONE STRING",然后是所有匹配项,但不是嵌套在 drupal 下,而是在同一级别。

4

2 回答 2

27

实际上,您可以在模式配置中执行类似的操作

%{WORD:[drupal][program]}

它将创建像

drupal:{
  program: "..."
}
于 2017-01-13T17:25:25.090 回答
13

是的,这是意料之中的。我认为没有办法用 grok 生成嵌套字段。我怀疑您必须使用mutate 过滤器将它们移动到位。

mutate {
    rename => {
      "date" => "[drupal][date]"
      "instigator" => "[drupal][instigator]"
      ...
    }
  }

如果您有很多字段,使用ruby​​ 过滤器可能更方便。如果您在 Drupal 字段前加上“drupal”等前缀,则尤其如此。– 然后您将编写一个过滤器以将具有该前缀的所有字段移动到具有相同名称的子字段中。

于 2015-02-26T18:51:02.107 回答