キャリテク!マガジン
- TOP
- キャリテク!マガジン
- 障害対応に強くなろう(4)障害対応のために覚えておきたいコマンド - grepを使ってログ調査の精度を向上しよう
障害対応に強くなろう(4)障害対応のために覚えておきたいコマンド - grepを使ってログ調査の精度を向上しよう
こんにちは。株式会社パイプラインの濱田です。前回はコマンドラインで障害対応を行う必要性、SSHでのログイン方法、ログファイル全体を俯瞰で見るためのコマンドについて取り上げました。今回は、ログファイルの中から効率的にエラーを見つける方法について取り上げてみたいと思います。
grepを使ってログファイルからパターンにマッチする行を表示しよう
grepコマンドは、入力された文字列からパターンにマッチする行を表示するためのコマンドです。grepそのものの詳細な解説はmanページを参照していただくとして、今回は「手っ取り早くgrepを使ってみる」ことにします。Linuxのターミナル上でmanページを見るには、「man(スペース)<コマンド名>」と入力します。
するとこのように、マニュアルが表示されます。
行を読みすすめるには「J」キーを、上に戻るには「K」キーを押します。マニュアルページから抜けるには「Q」キーを押します。また、Linuxディストリビューションのマニュアルページでは翻訳版が公開されていることもあります。今回取り上げるgrepについてはこちら http://manpages.ubuntu.com/manpages/focal/ja/man1/grep.1.html を参考にしてもよいでしょう。
サーバー運用を行うにあたって、ログファイルから障害調査や不正利用・不正アクセスの調査を行う機会は非常に多く、是非grepコマンドを覚えておきたいものです。次に、grepコマンドの利用例をいくつかピックアップします。
文字列「error」をログの中から探してみよう
WEBサーバー nginx のエラーログから文字列「error」が記録されている行を抜き出すには以下コマンドを実行します。(ログファイル名 ディレクトリ名は一例です)
grep -e error /var/log/nginx/error.log |
上記のコマンドで何らかの出力がある場合、該当するエラーがどれだけの影響を及ぼしているか調査します。ただし、上記コマンドでは「error」という文字列を検出できても「Error」や「ERROR」は検出できません。大文字小文字の区別なしにgrepコマンドに検索させたい場合は以下のように「-i」オプションをつけて実行します。
grep -i -e error /var/log/nginx/error.log |
errorの他にも省略形の「err」で検索してもよいでしょう。また、他のエラーレベル「warn」「crit」「alert」「emerg」で検索してみましょう。「error」または「warning」のどちらかにマッチする行を大文字小文字の区別をせず探す場合は以下のように実行します。
grep -i -e error -i -e warning /var/log/nginx/error.log |
このように複数の単語をパターンとして検索する場合に「-e」オプションを利用します。もちろん、検索する単語が1つでも有用ですので、普段から「-e」オプションをつけておくクセをつけておいてもよいでしょう。
grepの反転一致を活用してより精緻な絞りこみをしよう
例えばシステム全体のログで重要なエラーを検出したい、けれどもnginxのエラーは除外したい、といった場合は以下のように実行します。
sudo grep -i -e error /var/log/messages | grep -i -v -e nginx |
最初のgrepコマンドでは、システム全体のログから「error」行を大文字小文字の区別なく検索しています。これをパイプライン「|」で次のgrepコマンドに渡し、nginxにマッチしない行のみを出力するようにしています。このように、「○○にマッチ”しない”」行を絞り込むには、grepコマンドの「-v」オプションを利用します。また、grepをパイプラインで繋いで多段実行するのもよく使うテクニックです。
次回はWEBサーバーのログ調査とログフォーマットについて取り上げてみたいと思います。まずはエンジニアデビューしたい、という方は、3ヶ月間学びながらお給料が貰える AltX キャリテク!の門を叩いてみてはいかがでしょう。