App::YG - ログをう゛ぁーてぃかるぱみゅぱみゅしちゃう!!

bayashi
2012-12-07

やあハッキングモンスターのみんな、元気かーい? ぼくは普通です。

きょうはみんなでログをう゛ぁーてぃかるぱみゅぱみゅしちゃうぞ!あ、こんにちは bayashi です。

さて、ログは見てるかい?cat してるかい? tail してるかい? GB単位のログを vim で開いてフリーズさせてやいないかい?ログは吐いたら終わりじゃいけないぜ!ちゃんとうぉっちしないと鬼がでちゃうぞ!!

とはいえ、そんなログも、たいていは1行につらつらと書かれてて見るのがつらいね!!例えばこんなやつだ。

$ tail log
127.0.0.1 - bayashi [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
127.0.0.1 - bayashi [10/Oct/2000:13:55:38 -0700] "GET / HTTP/1.0" 200 6789 "http://www.example.com/docs/2.2/logs.html" "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"
127.0.0.1 - bayashi [10/Oct/2000:13:55:39 -0700] "GET /apache_pc.gif HTTP/1.0" 200 1234 "http://www.example.com/start.html" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5"

こういうのを何千行も見て無意識に脳内パーズして目grepしてたら、頭がおかしくなってゾンビになりかけるだろ?

だからぼくは、yg っていうコマンドを使ってこうしてみるんだ!!

$ yg log
******************** 1 ********************
     Host: 127.0.0.1
    Ident: -
 Authuser: bayashi
     Date: 10/Oct/2000:13:55:36 -0700
  Request: GET /apache_pb.gif HTTP/1.0
   Status: 200
    Bytes: 2326
  Referer: http://www.example.com/start.html
UserAgent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

******************** 2 ********************
     Host: 127.0.0.1
    Ident: -
 Authuser: bayashi
     Date: 10/Oct/2000:13:55:38 -0700
  Request: GET / HTTP/1.0
   Status: 200
    Bytes: 6789
  Referer: http://www.example.com/docs/2.2/logs.html
UserAgent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0

******************** 3 ********************
     Host: 127.0.0.1
    Ident: -
 Authuser: bayashi
     Date: 10/Oct/2000:13:55:39 -0700
  Request: GET /apache_pc.gif HTTP/1.0
   Status: 200
    Bytes: 1234
  Referer: http://www.example.com/start.html
UserAgent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5

どうだい?わいるどだろぉ?!

App::YG

yg コマンドは App::YG っていうモジュールをインストールしたらくっついてくるぞ!!

$ sudo cpan App::YG

これでいつでも yg を使ってログをう゛ぁーてぃかるぱみゅぱみゅできちゃうぞ!簡単すぎますね!!

でも実は、ラベルを付けて縦表示というのはどんなログでもできるというわけじゃあないぞ!!できると思った?!できません!!テヘペロ!残念でした!!

いまのところ、apache / apache combined / apache error / nginx main がう゛ぁーてぃかるぱみゅぱみゅできるぞ!もし他のログ形式に対応したい場合は App::YG::Foo::Bar のようなものを書いて、

$ yg -p foo-bar hoge.log

という風に、パーザに指定すればOK!!

結構面倒だね!こんなんじゃ使いたくないよ!!ってボクも思っちゃいました!!あちゃー><

さくっと縦分割

でもやっぱり諦めたくない!諦めたらそこでPONPONPONですよ!!

というわけで、ログなんてだいたいタブ区切りとかですよね!!だからもうそういうのは適当にさくっとやっちゃえばいいんですよ!!

d オプションでぱみゅれます。

$ yg -d -n fuga.log
******************** 1 ********************
1: 2012-11-27 14:34:08
2: [warn]
3: MyDoc/wiki/perl/robots could not find MyDoc/wiki/perl/robots at dev/MyApp/lib/MyApp/C/MyApp/Wiki.pm line 31.\n
4: METHOD:'GET'
5: REQ:'/wiki/perl/robots.txt'
6: IP:'***.***.***.***'
7: UA:'libwww-perl/6.04'
8: REF:''
9: (MyApp::F::Entry L15)

******************** 2 ********************
1: 2012-11-27 14:34:08
2: [warn]
3: Wiki Not Found
4: METHOD:'GET'
5: REQ:'/wiki/perl/robots.txt'
6: IP:'***.***.***.***'
7: UA:'libwww-perl/6.04'
8: REF:''
9: (MyApp::C::MyApp::Wiki L33)

******************** 3 ********************
1: 2012-11-27 14:34:08
2: [warn]
3: MyDoc/wiki/robots could not find MyDoc/wiki/robots at dev/MyApp/lib/MyApp/C/MyApp/Wiki.pm line 31.\n
4: METHOD:'GET'
5: REQ:'/wiki/robots.txt'
6: IP:'***.***.***.***'
7: UA:'libwww-perl/6.04'
8: REF:''
9: (MyApp::F::Entry L15)

やったね、たえちゃん!!(-n はラベルの代わりに項目番号を出すオプションです。)

ちなみに、yg は標準入力を受けてう゛ぁーてぃかるぱみゅぱみゅることもできるぞ!!

$ cat page.log | yg

まとめ

まあぶっちゃけ、ログなんてどうせ grep して絞り込んで目的のもの以外みてねーよという人が多いかもしれませんが、だらだら流してみてる場合なんかにはこういうのが有効かもしれないぞ!!

詳しいオプションは yg -h か man yg で参照するとお得!! あなたの予想に反して、無駄に多くのオプションが用意されていてびっくり仰天することうけあいだ!!

というわけで、このモジュールが少しでもみなさまのお役に立てれば幸いだぞ! bayashi でした!!