この投稿は インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016 - Qiitaの10日目 の記事です。
こんにちはsekineです。
最近ハリーポッターにハマって通勤中に読んでいます。
今Huluで映画版を見ながらこの記事を書いています。
(おかげで筆が全然進みません)
さて、今回の記事はログの監視に一手間加えて見やすくしちゃおうという記事です。
ここで紹介する方法は特に新しいソフトウェアを入れずに基本的なlinuxコマンドだけで行うので環境を問わず使えると思います。
「tail -f」でログ追えてますか?
Webサービス開発をしているとApacheやアプリのログをtail -f
で監視する機会が良くあります。
ですが流れてくるログの量が多いとなかなか目視で追うのが大変です。
↑このログ目視で追えますか?
1行だけ404
を返しているログがあるのですが分かったでしょうか?
私は無理でした。。
流れているログは何故見にくいのか
- 文字列が単色である
- 見る必要のないログが大量にながれている
の2点が大きいのではないかと思います。
見たい行だけ表示したらいいじゃない「tail -f | grep」
もっともシンプルなやり方ですが、tail -f
に|
(パイプ)でgrep
コマンドを組み合わせましょう。
この通りtail -f
の中でgrep
コマンドでヒットした行だけを表示することが出来ます。
また、grep
コマンドのオプションで--color
を指定するとgrep
条件にヒットした箇所に色を付けて強調表示されます。
これで十分満足できることも多いと思いますがこの方法だと、
grep
条件に一致しなかった行を表示できない- 検索条件を1つしか指定できない
という問題があります。
ファイルの更新を追いながら検索したい「less +F」
less +F ファイル名
コマンドではtail -f
と同じようにファイル末尾の更新を追う事ができます。
tail
コマンドとの違いは「コマンドを終了せずにless
コマンドを使う」ことができます。
less +F
コマンドを実行すると画面にWaiting for data... (interrupt to abort)
という表示が出ます。
この状態でファイルの末尾に更新があるとtail -f
と同じように画面に更新が表示されます。
その状態でctrl + c
を入力するとで更新の追跡を停止して通常のless
コマンドでファイルを開いた状態になります。
less
コマンド上で文字列を検索するには/検索文字列(正規表現可)
を入力します。
再び更新を追跡するには「shift + f」を入力します。
追跡を再開すると「追跡を停止した時点」から「再開した時点」に行われた更新も反映されるのでログが欠損することはありません。
また検索を行った後に追跡を再開すると検索文字列の強調状態で追跡を行うことが出来ます。
less
コマンドの詳しい使い方はGoogle先生に聞くと良いと思います。(丸投げ)
ちなみに「tail less」で検索すると「less +F」コマンドがどれだけ良いものか先人達がまとめてくれているので合わせて読むとより分かりやすいかと思います。(丸投げ)
less +F
コマンドではtail -f | grep
とは違い検索条件に一致しなかった行を表示することが出来ます。
ですが相変わらず検索条件を1つしか指定できません。
単一条件では満足できないアナタへ「tail -f | sed」
詳細の説明は後でするのでまずはPOST
と404
を強調表示させた結果からどうぞ。
かなり見やすくなったのではないでしょうか?
実は今回の記事で一番紹介したかったのがこの方法です。
ではコマンドの解説をしていきます。
tail -f ./access.log | sed -e "s@\(404\)@\x1b[1;31m\1\x1b[0m@g" -e "s@\(POST\)@\x1b[1;32m\1\x1b[0m@g"
↑が先程のサンプルで実行したコマンドです。
(osxに標準インストールされているsed
コマンドでは正しく動かないので、gnu-sed
をインストールした上で以降のsed
コマンドをgsed
に置き換えて読み進めて下さい)
404
の文字列を赤色にしたのは、
sed -e "s@\(404\)@\x1b[1;31m\1\x1b[0m@g"
の部分です。
このコマンドを更に分解すると、
- 検索条件:
\(404\)
- 置換文字:
\x1b[1;31m\1\x1b[0m
となります。
つまり、「404
」という文字列を「\x1b[1;31m404
\x1b[0m」に置換する、という内容になります。
そしてこの\x1b[1;31m
と\x1b[0m
こそが文字列を赤色にするためのポイントです。
ではこの謎の文字列についての説明をします。
まず\x
はこの文字に続く2文字をASCIIコードの16進数文字として解釈させることを宣言します。
なので\x1b
はASCIIコードの1b
、つまりESC(エスケープ)
を表します。
\1b[
はESC[
ということになります。
ESC[
は画面出力を制御するCSI
(Control Sequence Introducer)シーケンスの開始を意味します。
1;31m
がCSI
シーケンスの設定値になります。
設定値は;
(セミコロン)区切りで複数の値をしていすることができます。
1
は「太字属性を設定する」、31
は「文字色を赤(色番号1)に設定する」という内容なので、1;31
は「太字で赤色にする」という設定内容になります。
文字色はターミナルの色選択によって異なるので自分の環境にあった色に置換すると良いでしょう。
そしてm
が設定値の終端を表します。
下記のサイトに設定値がまとめられているのでありがたく活用しましょう。
\x1b[0m
は先程の\x1b[1;31m
とほとんど同じ内容で、CSI
シーケンスの設定値が0
になっています。
これはそこまでに設定されていたCSI
シーケンスによる出力の制御を終了するための定義です。
この定義を忘れるとどこまでも文字色の変更などが反映され続けてしまうので注意しましょう。
さて、この正規表現のルールですが設定の自由度が高い反面、コマンドが非常に長いです。。
そこで便利なのがこのスクリプト↓。
と、なんだか胡散臭い感じの紹介になってしまいましたが非常に便利なスクリプトです。
(しかも私が作ったものでは無いので勝手に紹介してます)
使い方は作者の方が説明されているとおり、
tail -f ファイル名 | colorizer.sed
とするだけです。
このスクリプトは編集が簡単なので独自のアプリログ用にカスタマイズするとログ調査が格段に捗ると思います。
参考サイト
おわり
いかがだったでしょうか?
今回紹介した方法でみなさんのログ調査が快適になれば幸いです。
明日以降の記事もお楽しみに!
インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016 - Qiitaの11日目の記事