SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Chiba.pm #3
2013/6/8
Mojoliciousの
ログ出力を改造する
いとちん @ayumu83s
perl歴は2年半くらい。
主にソーシャルゲームの開発をしています。
自己紹介
いとちん @ayumu83s
perl歴は2年半くらい。
主にソーシャルゲームの開発をしています。
自己紹介
開発業務の他にも・・・
開発業務の他にも・・・
開発業務の他にも・・・
開発業務の他にも・・・
開発業務の他にも・・・
俺じゃなくてもよくね?
ここから、本題。
Mojoliciousのログ
[Thu Jun 7 00:10:31 2013] [debug] 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] 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).
Mojoliciousのログ
[Thu Jun 7 00:10:31 2013] [debug] 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] 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).
Mojoliciousのログ
[Thu Jun 7 00:10:31 2013] [debug] 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] 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).
パッケージ名とか
行数が欲しくね?
ググった
ググった → あった。
サブルーチンを上書きする作戦
# ここから
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";
};
}
# ここまで追加
サブルーチンを再定義する作戦
# ここから
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";
};
}
# ここまで追加
*[パッケージ名][関数名]に
無名関数を突っ込むと
再定義できる。
サブルーチンを上書きする作戦
# ここから
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する
そしてこうなった。
[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).
そしてこうなった。
[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).
我々の勝利である。
完
人のブログパクっただけじゃねーか
人のブログパクっただけじゃねーか
オブジェクト指向なやり方も
実装を試しました。
OOP的なやり方
OOP的なやり方
ざっくり概要。
OOP的なやり方
ざっくり概要。
1.Mojo::Logを派生したクラスを定義。
OOP的なやり方
ざっくり概要。
1.Mojo::Logを派生したクラスを定義。
↓
2.formatメソッドをオーバーライド。
ざっくり概要。
1.Mojo::Logを派生したクラスを定義。
↓
2.formatメソッドをオーバーライド。
↓
3.インスタンスを作成。
OOP的なやり方
ざっくり概要。
1.Mojo::Logを派生したクラスを定義。
↓
2.formatメソッドをオーバーライド。
↓
3.インスタンスを作成。
↓
4.logオブジェクトにぶっこみまーす。
OOP的なやり方
派生クラスの定義
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__
派生しました。
派生クラスの定義
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__
オーバーライド
しました。
インスタンスのぶっこみ
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');
:
ぶっこみました。
インスタンスのぶっこみ
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
に出力される。
ぶっこみました。
そしてこうなった。
[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).
そしてこうなった。
[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).
我々の大勝利である。
これでログを改造し放題!!
これでログを改造し放題!!
例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).
これでログを改造し放題!!
例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).
まとめ
パッケージ名と行数が分かれば
デバッグが捗る!
ご静聴、
ありがとうございました。

Weitere ähnliche Inhalte

Andere mochten auch

Gofのデザインパターン stateパターン編
Gofのデザインパターン stateパターン編Gofのデザインパターン stateパターン編
Gofのデザインパターン stateパターン編Ayumu Itou
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)charsbar
 
Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changingcharsbar
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerlcharsbar
 
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンスLivesense Inc.
 

Andere mochten auch (7)

Gofのデザインパターン stateパターン編
Gofのデザインパターン stateパターン編Gofのデザインパターン stateパターン編
Gofのデザインパターン stateパターン編
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)
 
Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changing
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerl
 
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
 

Kürzlich hochgeladen

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Kürzlich hochgeladen (10)

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

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