📒

開発現場でパターン化できそうなTips【ログ調査①】

2021/12/21に公開

開発だけじゃないよ現場で必要なスキルは

エンジニアとして仕事をしていると開発以外の作業をこなさなければならない場面に少なからず出くわすと思います。不具合調査・ビジネスサイドとのコミュニケーション・DX(開発者体験)の向上などなどコーディング以外のタスクを実際にこなしていく中でTipsとしてパターン化できそうなものを実体験を基にまとめていってみようかなと思っています。

ケーススタディ(ログ調査①)

アプリケーションサーバーに日次でのアクセスログファイルがあるとします。該当期間のログファイルを時系列で結合して、その中から任意の文字列を含む行だけに加工したファイルが最終的に欲しいというケースを想定します。
少し具体的にするとある特定ユーザのある期間におけるアプリケーションの行動履歴を時系列で追いたいみたいなケースです。

複数ログファイルの結合処理

いろいろな手段でいろいろな方法が考えられるかと思いますが、今回は手軽にサクッと本業の傍らの作業を想定してシェル(bash)を使います

accesslog.20211201.log
2021/12/01 09:58:46.004 userId:9999 /path/to/actionA
2021/12/01 09:58:46.008 userId:9999 /path/to/actionB
2021/12/01 10:58:46.008 userId:1111 /path/to/actionB
accesslog.20211202.log
2021/12/02 09:58:46.004 userId:9999 /path/to/actionC
2021/12/02 09:58:46.008 userId:9999 /path/to/actionD
2021/12/02 10:58:46.008 userId:1111 /path/to/actionC
accesslog.20211203.log
2021/12/03 20:58:46.004 userId:1111 /path/to/actionX
2021/12/03 20:59:46.008 userId:9999 /path/to/actionY

上記のようなファイルがあったとして、適当な作業ディレクトリにすべて入れます。

ls -1 | sort | xargs cat > all_log.log

上記のコマンドで作業ディレクトリ内のファイルをすべてファイル名で自然順にソートした上で結合した結果を最終リダイレクト先(all_log.log)に出力できます。

結合した全体から任意の文字列を含む行のみを抽出

こちらもsedコマンドで置換したりといろいろやり方はあるかと思いますが、インタラクティブに作業したいかつ、結果をそのままダイレクトに見たいとしてVSCodeの検索置換機能を使うことにします。

前ステップで作成した結合済みのファイルをVSCodeで開いてCtrl + Hで正規表現による検索欄に

^(?!.*残したい文字列).*\n

を入力します。今回はuserIdが9999のユーザの操作の流れを可視化したいとして

^(?!.*9999).*\n

と入力すると9999を含まない行が対象としてハイライトされます。

そのまま空文字で置換(Ctrl + Al + Enter)すればuserId:9999の操作に絞った状態のログファイルの完成です。

まとめ

エンジニアとして仕事をしていくにはプログラミング自体のスキルも大事ですが、急事に問題に対応できる瞬発力みたいなものも実現場では重要で日頃からツールや、問題調査の手順をパターン化しておくと瞬発力が上がっていくと思っています。
これからも実務の中でいろいろ試してみた結果の些細なTipsを共有していければと思っています。

Discussion