我正在接收一条 JSON 消息(Cloudtrail,许多对象连接在一起),当我完成过滤它时,Logstash 似乎没有正确解析消息。就好像散列被简单地转储到一个字符串中。
无论如何,这是输入和过滤器。
input {
s3 {
bucket => "stanson-ops"
delete => false
#snipped unimportant bits
type => "cloudtrail"
}
}
filter {
if [type] == "cloudtrail" {
json { # http://logstash.net/docs/1.4.2/filters/json
source => "message"
}
ruby {
code => "event['RecordStr'] = event['Records'].join('~~~')"
}
split {
field => "RecordStr"
terminator => "~~~"
remove_field => [ "message", "Records" ]
}
}
}
当我完成时,elasticsearch 条目包含一个RecordStr
带有以下数据的键。它没有message
字段,也没有Records
字段。
{"eventVersion"=>"1.01", "userIdentity"=>{"type"=>"IAMUser", "principalId"=>"xxx"}}
请注意,这不是JSON 样式,它已被解析。(这对于 concat->split 的工作很重要)。
因此,RecordStr
作为一个值,键看起来不太正确。此外,在 Kibana 中,可过滤字段包括RecordStr
(无子字段)。它包括一些不再存在的条目:Records.eventVersion
, Records.userIdentity.type
.
这是为什么?如何获得正确的字段?
编辑 1这是输入的一部分。
{"Records":[{"eventVersion":"1.01","userIdentity":{"type":"IAMUser",
这是未经修饰的 JSON。看起来文件的主体(上面)在message
字段中,json
提取它,我最终在Records
字段中得到一个记录数组。这就是我加入并拆分它的原因——然后我得到了单独的文档,每个文档都有一个RecordStr
条目。但是,模板(?)似乎不理解新结构。