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
キーは 1 つの値として正しくないように見えます。さらに、Kibana では、フィルタリング可能なフィールドにRecordStr
(サブフィールドなし) が含まれます。もう存在しないいくつかのエントリが含まれています: Records.eventVersion
, Records.userIdentity.type
.
何故ですか?適切なフィールドを取得するにはどうすればよいですか?
edit 1入力の一部です。
{"Records":[{"eventVersion":"1.01","userIdentity":{"type":"IAMUser",
これは整形されていない JSON です。ファイルの本体 (上記) がmessage
フィールドにあるように見え、json
それを抽出すると、フィールドにレコードの配列ができてしまいRecords
ます。RecordStr
そのため、結合して分割します。最終的には、それぞれが 1 つのエントリを持つ個別のドキュメントになります。しかし、テンプレート(?)は新しい構造を理解していないようです。