如何使用 logstash 解析遵循 ECS(弹性通用模式)的纯文本日志?
How can I parse plain text log following ECS (elastic common schema) with logstash?
我正在使用 rsyslog 将纯文本日志发送到 logstash。但是我无法通过 grok 将数据分配给 host.name 或 host.ip 字段。系统通过以下错误:
Could not index event to 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", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"Could not dynamically add mapping for field [host.ip]. Existing mapping for [host] must be of type object but found [text]."}}}}
我尝试使用 [host][name] 但出现错误消息:
Grok regexp threw exception {:exception=>"Could not set field 'name' on object '' to value ''.This is probably due to trying to set a field like [foo][bar] = someValuewhen [foo] is not either a map or a string" ...
这是 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 已经与 message
字段一起发送了另一个名为 host
的字段,它是一个简单的字符串。然后,当您尝试将某些内容分配给 [host][ip]
时,它会失败,因为 [host]
不是对象而是字符串。
您可以尝试将原来的 host
字段重命名为其他名称,它应该可以工作:
在您的 grok
过滤器之前添加:
mutate {
rename => {
"[host]" => "[source][address]"
}
}
我正在使用 rsyslog 将纯文本日志发送到 logstash。但是我无法通过 grok 将数据分配给 host.name 或 host.ip 字段。系统通过以下错误:
Could not index event to 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", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"Could not dynamically add mapping for field [host.ip]. Existing mapping for [host] must be of type object but found [text]."}}}}
我尝试使用 [host][name] 但出现错误消息:
Grok regexp threw exception {:exception=>"Could not set field 'name' on object '' to value ''.This is probably due to trying to set a field like [foo][bar] = someValuewhen [foo] is not either a map or a string" ...
这是 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 已经与 message
字段一起发送了另一个名为 host
的字段,它是一个简单的字符串。然后,当您尝试将某些内容分配给 [host][ip]
时,它会失败,因为 [host]
不是对象而是字符串。
您可以尝试将原来的 host
字段重命名为其他名称,它应该可以工作:
在您的 grok
过滤器之前添加:
mutate {
rename => {
"[host]" => "[source][address]"
}
}