ECS Service のコンテナログからネストされたキーの取得をどのように対応したかをまとめました。
実施内容は https://github.com/kenzo0107/sample-fluentbit-get-nested-key にてまとめています。
キー log の中身だけ欲しい場合
1 2 3 4 5 6
| { "log": { "a": "1", "b": "2" } }
|
1 2 3 4 5 6 7 8
| $ docker run --rm -it \ -v $(PWD)/sample1.conf:/fluent-bit/etc/sample.conf \ amazon/aws-for-fluent-bit:2.23.0 /fluent-bit/bin/fluent-bit \ -c /fluent-bit/etc/sample.conf
...
[0] *-firelens-*: [1648191581.185935500, {"a"=>"1", "b"=>"2"}]
|
抽出できました。
キー log の中の b の中身だけ欲しい場合
1 2 3 4 5 6 7 8
| { "log": { "a": "1", "b": { "c": "2" } } }
|
1 2 3 4 5 6 7 8
| $ docker run --rm -it \ -v $(PWD)/sample2.conf:/fluent-bit/etc/sample.conf \ amazon/aws-for-fluent-bit:2.23.0 /fluent-bit/bin/fluent-bit \ -c /fluent-bit/etc/sample.conf
...
[0] *-firelens-*: [1648192323.237149000, {"c"=>"2"}]
|
抽出できました
キー log の b のリストの中身だけ欲しい場合 その 2
1 2 3 4 5 6 7 8 9 10
| { "log": { "a": "1", "b": [ { "c": "2" } ] } }
|
1 2 3 4 5 6 7 8 9
| $ docker run --rm -it \ -v $(PWD)/sample3.conf:/fluent-bit/etc/sample.conf \ -v $(PWD)/test.lua:/fluent-bit/etc/test.lua \ amazon/aws-for-fluent-bit:2.23.0 /fluent-bit/bin/fluent-bit \ -c /fluent-bit/etc/sample.conf
...
[filter:nest:nest.1] Value of key 'b' is not a map. Will not attempt to lift from here
|
b は map 型でなく nest では抽出できませんでした。
lua スクリプトで対応
以下 lua スクリプトをかませて b キーの中身を取得します。
1 2 3 4 5 6 7
| function cb_split(tag, timestamp, record) if record['b'] ~= nil then return 2, timestamp, record['b'] else return 2, timestamp, record end end
|
1 2 3 4 5
| [Filter] Name lua Match *-firelens-* script test.lua call cb_split
|
1 2 3 4 5 6 7 8 9
| $ docker run --rm -it \ -v $(PWD)/sample4.conf:/fluent-bit/etc/sample.conf \ -v $(PWD)/test.lua:/fluent-bit/etc/test.lua \ amazon/aws-for-fluent-bit:2.23.0 /fluent-bit/bin/fluent-bit \ -c /fluent-bit/etc/sample.conf
...
[0] *-firelens-*: [1648192853.650025200, {"c"=>"2"}]
|
抽出できました。
まとめ
Value of key 'xxx' is not a map. Will not attempt to lift from here
エラーについて
fluentbit の公式マニュアルにある Lua script で非常にシンプルなスクリプトで対応できました。
以上
参考になれば幸いです。