Mojoliciousのログ出力を改造する in chiba.pm #3

1,351 views

Published on

chiba.pm #3のLT用に作った資料。

Published in: Technology
  • Be the first to comment

Mojoliciousのログ出力を改造する in chiba.pm #3

  1. 1. Chiba.pm #32013/6/8Mojoliciousのログ出力を改造する
  2. 2. いとちん @ayumu83sperl歴は2年半くらい。主にソーシャルゲームの開発をしています。自己紹介
  3. 3. いとちん @ayumu83sperl歴は2年半くらい。主にソーシャルゲームの開発をしています。自己紹介
  4. 4. 開発業務の他にも・・・
  5. 5. 開発業務の他にも・・・
  6. 6. 開発業務の他にも・・・
  7. 7. 開発業務の他にも・・・
  8. 8. 開発業務の他にも・・・俺じゃなくてもよくね?
  9. 9. ここから、本題。
  10. 10. Mojoliciousのログ[Thu Jun 7 00:10:31 2013] [debug] GET / (Mozilla/5.0 (Macintosh; Intel MacOS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013] [debug] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013] [debug] Example::welcome start[Thu Jun 7 00:10:31 2013] [debug] id:1[Thu Jun 7 00:10:31 2013] [debug] name:itou[Thu Jun 7 00:10:31 2013] [debug] id:2[Thu Jun 7 00:10:31 2013] [debug] name:ayumu[Thu Jun 7 00:10:31 2013] [debug] id:3[Thu Jun 7 00:10:31 2013] [debug] name:ayumu83s[Thu Jun 7 01:21:42 2013] [debug] Example::welcome end[Thu Jun 7 00:10:31 2013] [debug] 200 OK (0.002594s, 385.505/s).
  11. 11. Mojoliciousのログ[Thu Jun 7 00:10:31 2013] [debug] GET / (Mozilla/5.0 (Macintosh; Intel MacOS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013] [debug] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013] [debug] Example::welcome start[Thu Jun 7 00:10:31 2013] [debug] id:1[Thu Jun 7 00:10:31 2013] [debug] name:itou[Thu Jun 7 00:10:31 2013] [debug] id:2[Thu Jun 7 00:10:31 2013] [debug] name:ayumu[Thu Jun 7 00:10:31 2013] [debug] id:3[Thu Jun 7 00:10:31 2013] [debug] name:ayumu83s[Thu Jun 7 01:21:42 2013] [debug] Example::welcome end[Thu Jun 7 00:10:31 2013] [debug] 200 OK (0.002594s, 385.505/s).
  12. 12. Mojoliciousのログ[Thu Jun 7 00:10:31 2013] [debug] GET / (Mozilla/5.0 (Macintosh; Intel MacOS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013] [debug] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013] [debug] Example::welcome start[Thu Jun 7 00:10:31 2013] [debug] id:1[Thu Jun 7 00:10:31 2013] [debug] name:itou[Thu Jun 7 00:10:31 2013] [debug] id:2[Thu Jun 7 00:10:31 2013] [debug] name:ayumu[Thu Jun 7 00:10:31 2013] [debug] id:3[Thu Jun 7 00:10:31 2013] [debug] name:ayumu83s[Thu Jun 7 01:21:42 2013] [debug] Example::welcome end[Thu Jun 7 00:10:31 2013] [debug] 200 OK (0.002594s, 385.505/s).パッケージ名とか行数が欲しくね?
  13. 13. ググった
  14. 14. ググった → あった。
  15. 15. サブルーチンを上書きする作戦# ここからif ($self->log->is_level(debug)) {no warnings redefine;*Mojo::Log::format = sub {my ($self, $level, @lines) = @_;my @caller = caller(4);my $caller = join , $caller[0], $caller[2];return[. localtime(time). "] [$level] [$caller] ". join("n", @lines) . "n";};}# ここまで追加
  16. 16. サブルーチンを再定義する作戦# ここからif ($self->log->is_level(debug)) {no warnings redefine;*Mojo::Log::format = sub {my ($self, $level, @lines) = @_;my @caller = caller(4);my $caller = join , $caller[0], $caller[2];return[. localtime(time). "] [$level] [$caller] ". join("n", @lines) . "n";};}# ここまで追加*[パッケージ名][関数名]に無名関数を突っ込むと再定義できる。
  17. 17. サブルーチンを上書きする作戦# ここからif ($self->log->is_level(debug)) {no warnings redefine;*Mojo::Log::format = sub {my ($self, $level, @lines) = @_;my @caller = caller(4);my $caller = join , $caller[0], $caller[2];return[. localtime(time). "] [$level] [$caller] ". join("n", @lines) . "n";};}# ここまで追加スタック情報から実行したパッケージ名とかをGETする
  18. 18. そしてこうなった。[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:38] GET / (Mozilla/5.0(Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Routes:171] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:15] Example::welcome start[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:1[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:itou[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:2[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:3[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu83s[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:22] Example::welcome end[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:25] 200 OK (0.002594s,385.505/s).
  19. 19. そしてこうなった。[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:38] GET / (Mozilla/5.0(Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Routes:171] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:15] Example::welcome start[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:1[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:itou[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:2[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:3[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu83s[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:22] Example::welcome end[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:25] 200 OK (0.002594s,385.505/s).我々の勝利である。
  20. 20.
  21. 21. 人のブログパクっただけじゃねーか
  22. 22. 人のブログパクっただけじゃねーかオブジェクト指向なやり方も実装を試しました。
  23. 23. OOP的なやり方
  24. 24. OOP的なやり方ざっくり概要。
  25. 25. OOP的なやり方ざっくり概要。1.Mojo::Logを派生したクラスを定義。
  26. 26. OOP的なやり方ざっくり概要。1.Mojo::Logを派生したクラスを定義。↓2.formatメソッドをオーバーライド。
  27. 27. ざっくり概要。1.Mojo::Logを派生したクラスを定義。↓2.formatメソッドをオーバーライド。↓3.インスタンスを作成。OOP的なやり方
  28. 28. ざっくり概要。1.Mojo::Logを派生したクラスを定義。↓2.formatメソッドをオーバーライド。↓3.インスタンスを作成。↓4.logオブジェクトにぶっこみまーす。OOP的なやり方
  29. 29. 派生クラスの定義package MojoSample::LogEx;use strict;use warnings;use parent qw/Mojo::Log/;sub format {my ($self, $level, @lines) = @_;my @caller = caller(4);return [ . localtime(time) . "][$level][$caller[0]:$caller[2]]" . join("n", @lines). "n";}1;__END__派生しました。
  30. 30. 派生クラスの定義package MojoSample::LogEx;use strict;use warnings;use parent qw/Mojo::Log/;sub format {my ($self, $level, @lines) = @_;my @caller = caller(4);return [ . localtime(time) . "][$level][$caller[0]:$caller[2]]" . join("n", @lines). "n";}1;__END__オーバーライドしました。
  31. 31. インスタンスのぶっこみsub startup {my $self = shift;my $home = $self->home;$self->log(MojoSample::LogEx->new(path => $self->log->path,level => $self->log->level));$self->log->debug(hello);:ぶっこみました。
  32. 32. インスタンスのぶっこみsub startup {my $self = shift;my $home = $self->home;$self->log(MojoSample::LogEx->new(path => $self->log->path,level => $self->log->level));$self->log->debug(hello);:出力先とログレベルを既定クラスに合わせる。path指定しないと、/var/log/mojo.logに出力される。ぶっこみました。
  33. 33. そしてこうなった。[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:38] GET / (Mozilla/5.0(Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Routes:171] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:15] Example::welcome start[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:1[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:itou[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:2[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:3[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu83s[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:22] Example::welcome end[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:25] 200 OK (0.002594s,385.505/s).
  34. 34. そしてこうなった。[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:38] GET / (Mozilla/5.0(Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36).[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Routes:171] Routing to controller "MojoSample::Controller::Example" andebug action "welcome".[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:15] Example::welcome start[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:1[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:itou[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:2[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:17] id:3[Thu Jun 7 00:10:31 2013][debug][MojoSample::Controller::Example:18] name:ayumu83s[Thu Jun 7 01:21:42 2013][debug][MojoSample::Controller::Example:22] Example::welcome end[Thu Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:25] 200 OK (0.002594s,385.505/s).我々の大勝利である。
  35. 35. これでログを改造し放題!!
  36. 36. これでログを改造し放題!!例1:ログ長いから短くするmy $now = localtime(time);my $lv = substr($level, 0, 1);return [ . $now . "][$lv][$caller[0]:$caller[2]] " . join("n",@lines) . "n";[Thu Jun 7 00:10:31 2013][d][Mojolicious::Plugin::RequestTimer:25] 200 OK (0.002594s, 385.505/s).
  37. 37. これでログを改造し放題!!例2:木曜日なら「麺」を表示する。my $now = localtime(time);$now =~ s/Thu/麺/;return [ . $now . "][$level][$caller[0]:$caller[2]] " . join("n",@lines) . "n";[麺 Jun 7 00:10:31 2013][debug][Mojolicious::Plugin::RequestTimer:25] 200 OK (0.002594s, 385.505/s).
  38. 38. まとめパッケージ名と行数が分かればデバッグが捗る!
  39. 39. ご静聴、ありがとうございました。

×