我正在接收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-gt;拆分工作很重要。)
因此,RecordStr
键看起来不是一个值。此外,在Kibana中,可过滤字段包括RecordStr
(无子字段)。它包含一些不再存在的条目:Records.eventVersion
,Records.userIdentity.type
。
为什么?我怎样才能得到合适的字段?
编辑1 这里是输入的一部分。
{"Records":[{"eventVersion":"1.01","userIdentity":{"type":"IAMUser",
这是未经批准的JSON。看来文件的正文(上面)位于message
字段中,json
将其提取出来,最后我会在Records
字段中找到一组记录。这就是为什么我加入并拆分它 - 然后我最终得到单个文档,每个文档都有一个RecordStr
条目。但是,模板(?)似乎并不了解新结构。
答案 0 :(得分:0)
我已经设计出一种方法,该方法可以根据您的请求为适当的CloudTrail字段建立索引。这是修改后的输入和过滤器配置:
input {
s3 {
backup_add_prefix => \"processed-logs/\"
backup_to_bucket => \"test-bucket\"
bucket => \"test-bucket\"
delete => true
interval => 30
prefix => \"AWSLogs/<account-id>/CloudTrail/\"
type => \"cloudtrail\"
}
}
filter {
if [type] == \"cloudtrail\" {
json {
source => \"message\"
}
ruby {
code => \"event.set('RecordStr', event.get('Records').join('~~~'))\"
}
split {
field => \"RecordStr\"
terminator => \"~~~\"
remove_field => [ \"message\", \"Records\" ]
}
mutate {
gsub => [
\"RecordStr\", \"=>\", \":\"
]
}
mutate {
gsub => [
\"RecordStr\", \"nil\", \"null\"
]
}
json {
skip_on_invalid_json => true
source => \"RecordStr\"
target => \"cloudtrail\"
}
mutate {
add_tag => [\"cloudtrail\"]
remove_field=>[\"RecordStr\", \"@version\"]
}
date {
match => [\"[cloudtrail][eventTime]\",\"ISO8601\"]
}
}
}
此处的主要观察结果是,分割完成后,事件中不再拥有有效的json,因此需要执行mutate替换(将'=>'转换为':',将'nil'转换为'null') 。此外,我发现从CloudTrail eventTime中获取时间戳并清理不必要的字段很有用。