如何使用logstash解析遵循ECS弹性通用模式的纯文本日志?

问题描述

我正在使用rsyslog将纯文本日志发送到logstash。但是我无法通过grok将数据分配给host.name或host.ip字段。系统通过以下错误提示

无法将事件索引到Elasticsearch。 {:status => 400,:action => [“ index”,{:_id => nil,:_index =>“ logstash-syslog-2020.09.03”,:routing => nil,:_type =>“ _ doc” },#LogStash :: Event:0x3273b8c],:response => {“ index” => {“ _ index” =>“ logstash-syslog-2020.09.03”,“ _type” =>“ _ doc”,“ _id” = >“ i2hRU3QBeWqyaoMf1lgh”,“状态” => 400,“错误” => {“类型” =>“ mapper_parsing_exception”,“原因” =>“无法为字段[host.ip]动态添加映射。[主机]必须是对象类型,但必须是[文本]。“}}}}

我尝试使用[host] [name],但收到错误消息:

Grok regexp引发了异常{:exception =>“无法将对象''的字段'name'设置为value”。这可能是由于尝试将[foo] [bar] = someValue设置为[foo ]既不是地图也不是字符串“ ...

这是grok配置:

grok {
  match => { "message" => "<%{INT:log.syslog.priority}>%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:host.name} %{DATA:process.name}(?:\[%{POSINT:process.pid}\])?: %{GREEDYDATA:syslog_message}" }
}

我的目的是根据ECS标准解析日志消息,以便SIEM应用程序可以分析这些日志。

解决方法

我认为rsyslog已经与host字段一起发送了另一个名为[host][ip]的字段,它是一个简单的字符串。然后,当您尝试为[host]分配内容时,它会失败,因为host不是对象,而是字符串。

您可以尝试将原始grok字段重命名为其他字段,并且该字段应该可以正常工作:

将其添加到mutate { rename => { "[host]" => "[source][address]" } } 过滤器之前

telnet host 5432