Регистрация IP-адреса, идентификатора транзакции или идентификатора сеанса в Mojo::Log

Я использую простую регистрацию в mojolicious приложении. Я хочу расширить ведение журнала некоторой информацией. Это может быть IP-адрес, идентификатор транзакции или идентификатор сеанса. Что я делаю раньше, так это пишу для каждого уровня журнала один помощник следующим образом:

$self->helper( 'info' => sub {
 my $self=shift;
 my $msg=shift;
 my $ip=$self->tx->remote_address;
 $self->app->log->info("[$ip] $msg");
});
...
$self->info("Login failed of user $user.");

Я хотел бы изменить формат вывода журнала, чтобы я мог использовать общую функцию журнала, которая будет добавлять любые дополнительные значения, которые мне нужны, и без большого количества помощников для каждого уровня журнала. Основной вызов:

$self->app->log->info("Login failed of user $user.");

также должен давать записи журнала, такие как

[Sun Jun  8 11:09:12 2014] [info] [127.0.0.1] Login failed of user Tim.

Я пытаюсь сделать это с помощью формата журнала изменений, но все, что я делаю, игнорируется.

$self->app->log->format(sub {
 my ($time, $level, @lines) = @_;
 return "[$time] [$level] [$self->tx->remote_address] @lines.\n";
});

Я знаю, что есть Log4Perl в сочетании с Mojolicious. Но я хочу, чтобы это было максимально просто.


person Tim    schedule 08.06.2014    source источник


Ответы (2)


Я сделал это довольно быстро, используя Mojolicious::Lite;

Для начала переместите бревно в место, которое вы сможете быстро найти.

use Mojo::Log;
my $log = Mojo::Log->new(path => '~/log/mojo.log');

Затем попробуйте это, сначала установите переменную удаленного адреса вне подпрограммы.

# $r_ip = remote ip address
my $r_ip = $self->tx->remote_address;

$self->app->log->format(sub {
     my ($time, $level, @lines) = @_;
     return "[" . localtime(time) . "]  [$level] [$r_ip] . join("\n", @lines) . "\n";
 });

Формат можно увидеть по адресу: http://mojolicio.us/perldoc/Mojo/Log.

person Ed Rantanen    schedule 14.09.2014

Существует возможность зарегистрировать уникальный идентификатор для каждого запроса/ответа? поток в списке рассылки Mojolicious, где Sebastian/sri — автор Mojolicious — отвечает:

Простой ответ: вы не можете, Mojolicious по своей природе асинхронен, и в любой момент времени могут быть активны тысячи одновременных запросов.

Сложный ответ: если вы ограничиваете свое приложение (через сервер) обработкой только одного запроса за раз и не используете какие-либо веб-функции в реальном времени (не то, чтобы это имело большой смысл, если вы не можете обрабатывать одновременные запросы), вы можете создать подкласс Mojo::Log, чтобы настроить формат сообщения и сохранить глобальный уникальный идентификатор для каждого нового запроса.

Другой (в настоящее время принятый) ответ делает именно это: он удаляет весь параллелизм и использует глобальную переменную. Это начнет ломаться, когда вы начнете использовать функции Mojolicious в реальном времени.

person Peter V. Mørch    schedule 16.08.2016