#JSONのログを加工してみます
下記のようなログを
[
{
"hoge": {
"abc" : "除外される",
"xyz" : "除外される",
"jjj" : "残る値"
},
"fuga" : "残る値",
"fuge" : "残る値"
},
{
"hoge": {
"abc" : "除外される",
"xyz" : "除外される",
"yyy" : "残る値2"
},
"fuga" : "残る値2",
"fuge" : "残る値2",
"fugeex" : "除外される"
}
]
こんな感じで加工しみたいと思います
[
{
"fuga": "残る値2",
"fuge": "残る値2",
"hoge": {
"yyy": "残る値2"
}
},
{
"fuga": "残る値",
"fuge": "残る値",
"hoge": {
"jjj": "残る値"
}
}
]
加工するためのソース
#! /usr/bin/env elixir
Mix.install([{:jason, "~> 1.2"}])
defmodule JFilter do
def remove(data, path) do
data
|> Enum.map(&pop_in(&1, path))
|> Enum.map(&elem(&1, 1))
end
end
data =
File.read!("log.json")
|> Jason.decode!()
|> Enum.reverse()
|> Enum.map(&Map.take(&1, ["hoge", "fuga", "fuge"]))
|> JFilter.remove(["hoge", "abc"])
|> JFilter.remove(["hoge", "xyz"])
|> Jason.encode!()
File.write!("out.json", data)
① File.read!("log.json")でログファイル読み込み
② Jason.decode!()でjsonをelixirで扱える形式に変換
③ Enum.reverse()配列を逆転
④ Enum.map(&Map.take(&1, ["hoge", "fuga", "fuge"])) 欲しい項目を選択
この例だと hoge、fuga、fugeの3つの項目を選択
⑤ Filter.remove(["hoge", "abc"]) 除外項目を選択
この例だと、 hogeの下にあるabcを除外
⑥ Jason.encode!() Json形式に変換
⑦ File.write!("out.json", data) ファイル出力
#おまけ
GCPのログを取得コマンド
下記の用にGCPのログを log.jsonに保存して上記のelixirで作ったスクリプトを流すとログ解析が少しは幸せに?なるかも。
gcloud logging read 'ログクエリ' --freshness="1m" --format=json > /log.json