2020/04/23更新

[シェル] grepで前後の行も表示して、エラーログ調査を楽にしよう

このエントリーをはてなブックマークに追加      

grepでヒットした行の前後を表示できると、エラー調査の時などにとても役立ちます。今日は、grepで前後の行を表示する方法をブログに書きたいと思います。



目次




なぜ、grepで前後の行を表示したいのか

目的は色々あると思いますが、僕はエラーログを調査するときに前後の行を表示します。エラーログの前には直前の作業のログが、後ろにはスタックトレースが出力されていることが多いです。grepでエラーログの前後も表示することで、エラー内容の特定に加えて、原因調査もできるので便利です。

以下で実際にやってみたいと思います。



grepで該当した行の前後を表示する

ヒットした行の前後を表示するには、下記のように実行します。
# 前後3行を表示する
$ grep -3 "ERROR" [ファイルパス]

# 前3行を表示する
$ grep -B 3 "ERROR" [ファイルパス]

# 後ろ3行を表示する
$ grep -A 3 "ERROR" [ファイルパス]

例えば、前後3行を表示すると、何をしていて、どんなエラーになったのか、を把握できるようになります。
# 前後3行を表示して、エラーの内容把握
$ grep -3 "ERROR" storage/logs/laravel-2020-04-03.log

# 以下出力内容

# 前3行(直前の作業)
[2020-04-03 10:40:02] local.INFO: user_id=1がログイン。
[2020-04-03 10:40:02] local.INFO: user_id=1がタスク(id=123)を作成。
[2020-04-03 10:40:02] local.INFO: user_id=1が発注書(id=123)を作成。

# grepでヒットした行
[2020-04-03 10:46:42] local.ERROR: Class App\Http\Controllers\TaskPreviewRequest does not exist. user_id=1.

# 後ろ3行(エラーのスタックトレースの一部)
[stacktrace]
#0 /var/www/html/myapp/vendor/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php(25): ReflectionParameter->getClass()
#1 [internal function]: Illuminate\\Routing\\RouteSignatureParameters::Illuminate\\Routing\\{closure}(Object(ReflectionParameter))
この場合、TaskPreviewRequestがないというエラーであることが分かります。また直前の行から、影響範囲はタスク作成や発注書作成周りであることが分かり、後ろの行から原因はリファクタリングの対応漏れかなと推測できます。



grepについてさらに詳しく

grepコマンドは使いこなすと非常に探し物が早くなります。以下の記事もぜひご覧ください。

[シェル] Grepでand検索、or検索、not検索、正規表現、再帰的に検索、圧縮ファイル内検索、など行う


最後に

最近は本番稼働中のシステムを調査をする仕事もあり、構成がわからない中でgrepを使いながら該当のファイルを探すことも多いです。Linuxコマンドが使えるようになるともっと作業効率化できるなと感じています。学んだことはブログにも書いていきたいと思います。

最後になりますが本ブログでは、サーバー、フロントエンド、PHP、Python、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。