小ネタ。僕はPerlのガードオブジェクトが大好きです。
例えばPSGIサーバーのリクエスト のログを出したい。ついでにどこのURLにアクセスされた時のログなのかも書き出したい。普通に考えると出力全てにURLをいれておけばいいんだけど、URLが長いとログが見にくい。
それならリクエスト開始と終了を区切ればどこからどこまでかわかるよね!ってことでガードで実装すると良い感じ
複数プロセスが立ち上がるサーバーならついでにログにPIDを入れておけばログが混ざってもだいたいこれで追える。
ついでに同じような仕組みで処理スピードのログも取れますのでいいですね。
例えばPSGIサーバーのリクエスト のログを出したい。ついでにどこのURLにアクセスされた時のログなのかも書き出したい。普通に考えると出力全てにURLをいれておけばいいんだけど、URLが長いとログが見にくい。
[/path/to/this/action?foo=1&bar=2&baz=3&hogehogehogehogehoge=1234] This is a debug log!
それならリクエスト開始と終了を区切ればどこからどこまでかわかるよね!ってことでガードで実装すると良い感じ
use strict;これなら自動的にリクエストが終わったらENDマークを入れてくれる!
use Log::Minimal;
use Scope::Guard;
use constant DEBUG => 1;
sub handle_psgi {
my ($self, $env) = @_;
my $guard;
if (DEBUG) {
debugf("BEGIN %s", $env->{REQUEST_URI});
$guard = guard {
debugf("END %s", $env->{REQUEST_URI});
};
}
.... リクエストの処理 ....
}
BEGIN [/path/to/this/action?foo=1&bar=2&baz=3&hogehogehogehogehoge=1234]
.... ログ色々 ....
END [/path/to/this/action?foo=1&bar=2&baz=3&hogehogehogehogehoge=1234]
複数プロセスが立ち上がるサーバーならついでにログにPIDを入れておけばログが混ざってもだいたいこれで追える。
ついでに同じような仕組みで処理スピードのログも取れますのでいいですね。
use strict;こういう仕組みでログやタイマーを入れ込んでおくと、定数畳み込みも効いてるから本番環境にデプロイする時にもDEBUGフラグの中身を変えられるようにしておけばコードをコメントアウトする必要もないのでいいと思います。
use Log::Minimal;
use Time::HiRes qw(gettimeofday tv_interval);
use constant DEBUG => 1;
sub handle_psgi {
my ($self, $env) = @_;
my $guard;
if (DEBUG) {
my $t0 = [gettimeofday];
$guard = guard {
my $elapsed = tv_interval($t0);
debugf("[%s]: TIMER %0.6f seconds", $env->{REQUEST_URI}, $elapsed);
};
}
.... リクエストの処理 ....
}
コメント