2013-08-21 3 views
2

У меня есть мозаичное веб-приложение, которое использует Log4perl для ведения журнала. Это многопользовательское приложение, и иногда бывает сложно следить за различными потоками в файле журнала, когда к приложению обращается более одного пользователя. Я бы хотел, чтобы каждый пользователь (население менее 25 пользователей) регистрировался в отдельном файле. Например. ./log/userX.log ./log/userY.log и т.д.Можно ли использовать Log4perl для создания файлов журнала пользователя?

Я думал об использовании что-то вроде этого в конфигурационном файле: log4perl.appender.MAIN.filename = юг {возвращение get_user_filename(); } , но регистратор определен в подпрограмме Mojolicious startup, и пользователь не известен до момента запроса.

Другая идея, которая кажется более перспективной, заключается в том, чтобы написать мост, который создает приложение для пользователя, а затем присваивает его регистратору. Затем я мог кэшировать приложение для последующего повторного использования (или уничтожить и воссоздать).

Я буду играть со вторым вариантом, но если кто-то попытался сделать это раньше и хочет поделиться своей мудростью, я был бы признателен.

- Update - Таким образом, в моем мосту маршрут я делаю следующее:

my $user = $self->req->headers->header('authuser'); # from apache 
my $appender = Log::Log4perl::Appender->new(
    'Log::Log4perl::Appender::File', 
    name => $user . "_file_appender", 
    filename => "/tmp/$user.log", 
    mode => "append", 
); 
$appender->layout($layout); # previously defined 
$appender->level($loglevel); # again previously defined and omitted for brevity 
Log::Log4perl::get_logger($user)->add_appender($appender); 
$self->app->log(Log::Log4perl::get_logger($user)); 

Я получаю следующее сообщение об ошибке, однако:

Can't locate object method File:() in Log::Log4perl::Appender at  /usr/local/share/perl/5.14.2/Log/Log4perl/Appender.pm line 282, <DATA> line 747. 

/TMP/пользователя .log создается, хотя (нулевая длина). Последняя установка CPAN для журнала :: Log4perl. Есть идеи?

+1

Рассматривали ли вы вход в DBI? Это упростит разделение/фильтрацию пользователем после события. –

+0

Да, но я не использую базу данных DBI. (Я знаю, я мог выбирать из дюжины разных БД с разными модулями). Файлы - это мое желание, легко читаемое и легко манипулируемое. – Todd

+0

Возможно, ваша ошибка связана с опечаткой. Он ищет «Файл:» в классе Appender. Предположительно, где-то написано «Файл». –

ответ

1

Мне понравился комментарий Ричарда и уже написал это, прежде чем вы сказали, что не хотите идти по маршруту БД. Поэтому я включаю его для других. Кроме того: я думаю, что запись в БД довольно тяжелая, иногда я лично выбираю файлы.

Где-то в верхней части запроса/доставки цикла (Catalyst пример) -

Log::Log4perl::MDC->put("user", $ctx->user_exists ? $ctx->user->id : 0); 

Тогда в Log4perl CONFIG-

log4perl.appender.toDBI     = Log::Log4perl::Appender::DBI 
log4perl.appender.toDBI.Threshold   = INFO 
log4perl.appender.toDBI.layout   = Log::Log4perl::Layout::NoopLayout 
log4perl.appender.toDBI.datasource  = sub { "DBI:mysql:" . db_name_function() } 
log4perl.appender.toDBI.attrs.f_encoding = utf8 
log4perl.appender.toDBI.username   = db_username 
log4perl.appender.toDBI.password   = s3cr37 
log4perl.appender.toDBI.sql    = INSERT INTO toDBI \ 
                 (user, file, line, message) \ 
                VALUES (?, ?, ?, ?) 
log4perl.appender.toDBI.usePreparedStmt = 1 
log4perl.appender.toDBI.params.1   = %X{user} 
log4perl.appender.toDBI.params.2   = %F 
log4perl.appender.toDBI.params.3   = %L 
log4perl.appender.toDBI.params.4   = %m 

Насколько файлы идут, я думаю, что это может быть возможно, но это будет не очень весело, кажется, вероятно, ввести ошибки, и, вероятно, преувеличен. Тривиально добавить что-то вроде user:{userid} к вашему протоколированию, а затем grep/ack logfile с этим, чтобы получить именно запрос пользователя/журнал.

+0

Спасибо за предложения. Возможно, мне придется упасть вернемся к использованию параметров пользователя и grep, но я чувствую, что мой код выше близок. Не уверен, почему я получаю сообщение об ошибке, которое я есть. – Todd

+0

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

Смежные вопросы