В состав перлового микрофреймворка Mojolicious::Lite входит класс Mojo::Log, который не просто пишет сообщения в лог, а ещё и учитывает важность сообщений — в отладочном режиме пишет много, а боевом — мало. Обнаружилось, что сообщения об ошибках имеют тот же класс debug
, что и остальные сообщения
[Tue Nov 13 12:25:51 2018] [debug] Format html [Tue Nov 13 12:25:51 2018] [debug] 200 OK (0.076118s, 13.137/s) [Tue Nov 13 12:25:53 2018] [debug] GET "/some/url" [Tue Nov 13 12:25:53 2018] [debug] Template "not_found.development.html.ep" not found [Tue Nov 13 12:25:53 2018] [debug] Rendering template "not_found.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Rendering template "layouts/error.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Rendering cached template "layouts/admin.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Rendering cached template "search_form_navbar.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Format html [Tue Nov 13 12:25:53 2018] [debug] 404 Not Found (0.004841s, 206.569/s)
из-за чего при запуске в продакшне под реальной нагрузкой в лог не попадает почти ничего — например, там нет сообщения об ошибках 404 Not Found.
Возможно, где-нибудь во внутренностях Mojo можно исправить такую ситуацию, но мы пойдём другим путём — применим хук after_dispatch:
hook after_dispatch => sub {
my $self = shift;
my $req = $self->req;
my $res = $self->res;
if ( $res->code >= 400 ) {
$self->app->log->error(join ' ',
'"' . $req->method . ' ' . $req->url . '"',
$res->code,
$req->headers->referrer || '-',
'"' . $req->headers->user_agent . '"',
);
}
};
Результат — в логе появились сообщения об ошибках:
Sending children hup signal [Tue Nov 13 12:30:46 2018] [error] "GET /none" 404 - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" [Tue Nov 13 12:44:50 2018] [error] "GET /SW/Rplayer.html" 404 - "Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)"