はじめに
IBM Log Analysis (旧IBM Log Analysis with LogDNA) のコンソールでログを検索し、絞り込んだログをエクスポートすると、JSONL(JSON Lines)形式のファイルになる。
これを元のコンソールで見ていた時と同じ見栄えに近付ける方法を模索してみた。
試行錯誤
このように表示されていたログをエクスポートすると・・・
まず、時刻が _ts
フィールドにミリ秒のUNIX時間で表現されてしまう。
"_ts": 1668866479459
これを、jqコマンドでローカルの時刻に変換するには、以下のようにすると良いらしい。
._ts / 1000 | localtime | todateiso8601
そして、時刻以外にコンソールに表示されていたフィールドは _host, ._app, .level, ._line
(.level
は上記の例では表示されていないが、ログのレベルを示すWARN、ERRORなど) で取れそうなので、エクスポートしたgzip圧縮のjsonlファイルを整形するには以下のようにする。
gzip -cd ファイル名 | jq -r '. | [(._ts / 1000 | localtime | todateiso8601) as $ts | $ts, ._host, ._app, .level, ._line] | @tsv'
しかし、エクスポートしたファイルは、時系列が降順になっているので、コンソールと同じ昇順にするには、最初にファイルの中身を逆さまにする必要がある。これを実現するtac
というコマンドがあることを初めて知りました。
結論
こうなりました。
gzip -cd ファイル名 | tac | jq -r '. | [(._ts / 1000 | localtime | todateiso8601) as $ts | $ts, ._host, ._app, .level, ._line] | @tsv'

なんかコンソールで見たのとちょっと違う・・・が、実際のサーバー上のログ/var/log/cron
を見ると、後者の方が正しい(_line
フィールドにあるものが、実際にログに出力された文字列で、コンソールに表示されていたのは、LogDNAが何かしらの法則で取り出したmessage
フィールドに入っていた文字列)ので、気にしないことにする。
役に立つことがあるか分からないが、一旦満足したのでメモ。