interprism's blog

インタープリズム株式会社の開発者ブログです。

カラフル「tail」でログ監視!

この投稿は インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016 - Qiitaの10日目 の記事です。

こんにちはsekineです。
最近ハリーポッターにハマって通勤中に読んでいます。
今Huluで映画版を見ながらこの記事を書いています。
おかげで筆が全然進みません

さて、今回の記事はログの監視に一手間加えて見やすくしちゃおうという記事です。
ここで紹介する方法は特に新しいソフトウェアを入れずに基本的なlinuxコマンドだけで行うので環境を問わず使えると思います。

「tail -f」でログ追えてますか?

Webサービス開発をしているとApacheやアプリのログをtail -fで監視する機会が良くあります。
ですが流れてくるログの量が多いとなかなか目視で追うのが大変です。

f:id:interprism:20161209225551g:plain

↑このログ目視で追えますか?
1行だけ404を返しているログがあるのですが分かったでしょうか?
私は無理でした。。

流れているログは何故見にくいのか

  • 文字列が単色である
  • 見る必要のないログが大量にながれている

の2点が大きいのではないかと思います。

見たい行だけ表示したらいいじゃない「tail -f | grep

もっともシンプルなやり方ですが、tail -f|(パイプ)でgrepコマンドを組み合わせましょう。

f:id:interprism:20161209231127g:plain

この通りtail -fの中でgrepコマンドでヒットした行だけを表示することが出来ます。
また、grepコマンドのオプションで--colorを指定するとgrep条件にヒットした箇所に色を付けて強調表示されます。

これで十分満足できることも多いと思いますがこの方法だと、

  • grep条件に一致しなかった行を表示できない
  • 検索条件を1つしか指定できない

という問題があります。

ファイルの更新を追いながら検索したい「less +F」

less +F ファイル名コマンドではtail -fと同じようにファイル末尾の更新を追う事ができます。
tailコマンドとの違いは「コマンドを終了せずにlessコマンドを使う」ことができます。

f:id:interprism:20161210002815g:plain

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

詳細の説明は後でするのでまずはPOST404を強調表示させた結果からどうぞ。

f:id:interprism:20161210010140g:plain

かなり見やすくなったのではないでしょうか?
実は今回の記事で一番紹介したかったのがこの方法です。

ではコマンドの解説をしていきます。

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;31mCSIシーケンスの設定値になります。
設定値は;(セミコロン)区切りで複数の値をしていすることができます。
1は「太字属性を設定する」、31は「文字色を赤(色番号1)に設定する」という内容なので、1;31は「太字で赤色にする」という設定内容になります。
文字色はターミナルの色選択によって異なるので自分の環境にあった色に置換すると良いでしょう。
そしてmが設定値の終端を表します。
下記のサイトに設定値がまとめられているのでありがたく活用しましょう。

対応制御シーケンス

\x1b[0mは先程の\x1b[1;31mとほとんど同じ内容で、CSIシーケンスの設定値が0になっています。
これはそこまでに設定されていたCSIシーケンスによる出力の制御を終了するための定義です。
この定義を忘れるとどこまでも文字色の変更などが反映され続けてしまうので注意しましょう。

さて、この正規表現のルールですが設定の自由度が高い反面、コマンドが非常に長いです。。
そこで便利なのがこのスクリプト↓。

qiita.com

と、なんだか胡散臭い感じの紹介になってしまいましたが非常に便利なスクリプトです。
(しかも私が作ったものでは無いので勝手に紹介してます)

使い方は作者の方が説明されているとおり、

 tail -f ファイル名 | colorizer.sed

とするだけです。
このスクリプトは編集が簡単なので独自のアプリログ用にカスタマイズするとログ調査が格段に捗ると思います。

参考サイト

detail.chiebukuro.yahoo.co.jp

おわり

いかがだったでしょうか?
今回紹介した方法でみなさんのログ調査が快適になれば幸いです。 明日以降の記事もお楽しみに!

インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016 - Qiita11日目の記事

PAGE TOP