Logstash 让grok筛选器创建嵌套字段作为结果

Logstash 让grok筛选器创建嵌套字段作为结果,logstash,syslog,logstash-grok,Logstash,Syslog,Logstash Grok,我有一个drupal看门狗syslog文件,我想将它解析为两个嵌套字段,syslog部分和message部分,以便得到这个结果 syslogpart: { timestamp: "", host: "", ... }, messagepart:{ parsedfield1: "", parsedfield2: "", ... } 我尝试制作一个自定义图案,如下所示: DRUPALSYSLOG(%%{SYSLOGTIMESTAMP:date}%%{SYSLOGHOST:l

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

syslogpart: {
  timestamp: "",
  host: "",
  ...
},
messagepart:{
  parsedfield1: "",
  parsedfield2: "",
  ...
}
我尝试制作一个自定义图案,如下所示:

DRUPALSYSLOG(%%{SYSLOGTIMESTAMP:date}%%{SYSLOGHOST:logsource}%%{WORD:program}:%%{URL:domain}\\\\\\\%%{EPOCH:EPOCH}\\\\\\\\{WORD:indicator}\\\\\\\{IP:IP}\\\\\\{URL:referer}\\\\\\\\\\\\\{URL:request}\\\\\\\(?\d+\\\\\\\\\\\\\\\\\\\\\\\\\\代码>

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


但我没有得到嵌套响应,而是得到一个textblock
drupal:“一个字符串中的所有匹配字段”
然后将所有匹配项分开,但不是嵌套在drupal下,而是嵌套在同一级别上。

是的,这是意料之中的。我认为没有办法用grok生成嵌套字段。我怀疑您必须使用

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

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

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

%{WORD:[drupal][program]}
它将创建json对象,如

drupal:{
  program: "..."
}

模式定义中直接支持方括号语法。无需进行变异/重命名!请参见下面的Julien答案。是的,除非您要创建
@元数据的子字段(或者,可能是名称中包含不寻常字符的其他字段),否则该方法确实有效。可以确认,仍然使用
logstash-7.11.0
。示例:
应用程序(?:\[%{WORD:[应用程序][上下文]}\]?\[%{WORD:[应用程序][消息ID]}\]\[%{WORD:[应用程序][日志类别]}\[%{WORD:[应用程序][日志优先级]}\]