fluentdなどに取り込む際にJSON形式のログを利用することがあるが、
テストでちゃんと送れているのかちょっと確認するときにtailしたログがやたら見づらかった。
第一段階
tail -f application_log | perl -F, -lane 'print $F[3],"\t",$F[5],"\t",$F[7],"\t",$F[9]'
のような感じで、”,”区切りで見たい情報がありそうなカラムの要素を指定していた。
出力するによって項目がずれたりしてかなり微妙な感じだった。
しかも確認したいカラムを先頭から数えてやんなきゃならない。
とりあえずの一時しのぎ。
第ニ段階
tail -f application_log | perl -MJSON -MData::Dumper -lne 'print Dumper(decode_json($_));'
perl脳なので、perlを使うというところから進歩していないが、-Mというオプションでモジュールをロードできることを知った。
読み込みたいモジュールが複数ある場合は、-Mをその分書くことで複数指定できる。
※当然だが、perlと使うモジュールがサーバーにインストールされていなければ利用できない。
JSONを配列形式にしてダンプすれば見やすいのではないかと考えたのがこれ。
見やすいは見やすいが、第一段階より情報量が多くてやっぱり扱いづらい。
第三段階
tail -f application_log | perl -MJSON -lne '$json=decode_json($_);@key=('id','sex','country','age');foreach $value(@key){if(defined $json->{$value}){print "$value >> ".$json->{$value}}} print "############END############\n"'
コマンドラインなので、だいぶごちゃごちゃしている&もはや手軽じゃないが、
内容はforeachで回してキーの存在確認をしているだけである。
予め欲しいキーを@keyに入れておいて、そのキーがJSON中に含まれていれば、キーと値をセットで出力。
綺麗じゃないけど、1行終わったら区切り線のようなものを出力。
とりあえず、ここまできてこれで出力内容に満足した。
補足
ちなみに日本語の値を含む要素などをprintしようとすると、
Wide character in print at -e
と表示されて怒られることがあるが、これはUTF-8フラグが付いているためなので、
binmode(STDOUT, ":utf8");
を付けてフラグを剥がすとよい