Plack::Middleware::AccessLog は Apacheライクなログが残せる便利ミドルウェアなんですが使う上で一つ注意点があります。
use Plack::Builder;
builder {
enable "AccessLog", format => "combined";
sub { die };
};
これで、500エラーのログが残ることを期待するかもしれませんが、実際は記録されません。
例外がMiddleware層を飛ばしてServerまで伝わる為で、何らかの形で例外を補足してあげる必要があります。
例えば、Plack::Middleware::HTTPExceptions
builder {
enable "AccessLog", format => "combined";
enable "HTTPExceptions";
sub { die };
};
もしくは自前でMiddlewareを書く方法。
use Plack::Builder
use Try::Tiny
builder {
enable "AccessLog", format => "combined";
enable_if { ($ENV{PLACK_ENV} || '') ne 'development'} sub {
my $app = shift;
sub {
my $env = shift;
try {
$app->($env);
} catch {
$env->{'psgi.errors'}->print($_);
[500,['Content-Type'=>'text/plain'],['Internal Server Error']];
}
}
};
sub { die };
};
やってることはHTTPExceptionsとほぼ同じです
Middlewareを使う場合は、miyagawaさんのslideにも登場する。この図を思い浮かべるといいと思います。
pylonsのドキュメントから転載です