问题描述
我正在使用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