アクセスログを tail -f するときの Tips

本記事は最終更新日より 1 年以上経過しております。
スポンサーリンク

 ここ数日は 24 時間起動しっぱなしのサブ機で PuTTy を立ち上げたまま、このブログのフロントとバックのアクセスログを垂れ流しにしてちょくちょく目視で確認したりしている。
 tail -f で流れるログの中でも知りたい所は「HTTP/1.0~2.0 なのか、ステータスコードはどうか」の 2 点。これをハイライトさせてしまえば垂れ流しでも確認を行いやすいから、どうやって実現するか。ということのメモ。


 最初にやっていた事は、自分の知識だけでやっていた物。

$ tail -f /path/to/access.log | egrep --color=auto 'HTTP\/[12]\.[01].+ [0-9]{3} '

 これで tail -f しながらも正規表現にマッチした部分は –color=auto によって自動で着色される。この場合、着色されるのは「HTTP/2.0″ 200」などという感じになる。ダブルクォーテーションまでマッチせざるを得ないポイントが気にくわない。神経質過ぎる所だが。

 そこで何か他の方法は無い物かと Google 先生を頼りに彷徨っていたら sed を用いる方法があった。これを試してみると理想通りにハイライトが可能であった。ただ、sed の正規表現ってエスケープしないといけない所が多いから余り好きじゃ無い。

tail -f /path/to/access.log | sed -e 's/ HTTP\/\([12]\.[0-2]\)\"/ \x1b[32mHTTP\/\1\x1b[0m\"/ig; s/ \([0-9]\{3\}\) / \x1b[32m\1\x1b[0m /ig;'

 これでやっていることは、sed の正規表現にマッチした部分をエスケープシーケンスでハイライトした物に置換している。
 「\x1b」がエスケープ、続いて「[32m」で表される物が文字色を緑色とするコード。ハイライトを終えるところでは「\x1b[0m」としてエスケープの次にデフォルトに戻す「[0m」を記述している。
 もちろん文字色の他、背景色のコードもあるので好きなように変更してあげると面白い。grep で実現するよりも sed の方が出来る事が多い。その反面、記述が面倒臭いのだが。

 上記 sed の設定に加えてリモートアドレスも伏せて tail -f したサンプルが次の通り。
28_tail_sed
 history に残っているうちはいいけど、消えたらまた入力が怠いから引数にログファイルをとるようなスクリプトを書いておいた方が良いかな。

他にも UA や気にしておきたい URI へのアクセスだとかピンポイントでハイライト出来るから今後も活用していきたい。

ちょっと思いついた事あったので追記

 Nginx のログ設定でリクエストタイムを末尾に追加している場合、フロントエンド側のキャッシュで返せてしまう場合は 0.000 が返る。これに着目をしたハイライトを行えば、キャッシュから返されたリクエストを視認し易くなる。

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';

 キャッシュから返されたリクエストのハイライトも絡めたコマンド。

$ tail -f /path/to/front.access.log | sed -e 's/ HTTP\/\(.\..\)\"/ \x1b[32mHTTP\/\1\x1b[0m\"/ig; s/ \([0-9]\{3\}\) / \x1b[32m\1\x1b[0m /ig; s/^\(.*0\.000\)$/\x1b[35m\1\x1b[0m/ig;'

更に詰めて色分けしてみたので追記 21:39

 手っ取り早くファイルに保存しておく感じでスクリプトとしておいた。

#/bin/bash

# Hilight HTTP Ver, status code
tail -f /path/to/access.log | \
    sed -e '
s/ HTTP\/\(.\..\)\"/ \x1b[32mHTTP\/\1\x1b[0m\"/ig;
s/\" \([23][0-9]\{2\}\) /\" \x1b[32m\1\x1b[0m /g;
s/\" \([45][0-9]\{2\}\) /\" \x1b[31m\1\x1b[0m /g;
s/\(Android [0-9.]\{3,5\}\|iPhone\)\; /\x1b[36m\1\x1b[0m\; /ig;
'

 このスクリプトで出来る事

  • HTTP のバージョンを緑色で表示
  • ステータスコード 200 を緑色、4xx, 5xx を赤色で表示
  • Android OS, iPhone からのアクセスだけ水色で表示

28_tail_sed2

 これでログ垂れ流しも少しは見やすくなる。ログ形式は Apache なら Combined、Nginx なら初期状態ならそのまま使える。形式が合わない物なら手打ちして直せばいいだけかなと。

スポンサーリンク