有一个grok过滤器创建嵌套字段作为结果

Kil*_*ler 10 syslog logstash logstash-grok

我有一个drupal watchdog syslog文件,我想解析基本上两个嵌套字段,syslog部分和消息部分,以便我得到这个结果

syslogpart: {
  timestamp: "",
  host: "",
  ...
},
messagepart:{
  parsedfield1: "",
  parsedfield2: "",
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

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下嵌套,而是在同一级别.

Jul*_*Vey 19

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

%{WORD:[drupal][program]}
Run Code Online (Sandbox Code Playgroud)

它将创建json对象

drupal:{
  program: "..."
}
Run Code Online (Sandbox Code Playgroud)


Mag*_*äck 11

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

mutate {
    rename => {
      "date" => "[drupal][date]"
      "instigator" => "[drupal][instigator]"
      ...
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果你有很多字段,使用红宝石过滤器可能会更方便.如果您使用例如"drupal"为Drupal字段添加前缀,则尤其如此. - 然后你编写一个过滤器来将带有该前缀的所有字段移动到具有相同名称的子字段中.