Создание саморегистрирующихся модулей с Журналом:: Log4perl

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

Вместо этого я хотел бы, чтобы модули обеспечили конфигурацию инициализации по умолчанию для Log4perl. Это обеспечило бы файл по умолчанию appender для категории модуля. Затем я мог переопределить это поведение initing Log4perl в вызывающей стороне с другой конфигурацией в случае необходимости, и все будет, надо надеяться, просто работать.

Этот вид обороны регистрирует возможное поведение, или я испытываю необходимость для доверия initing Log4perl в каждом .pl сценарии, который называет модуль, который я хочу зарегистрированный?

8
задан Ether 10 June 2010 в 21:47
поделиться

1 ответ

Я делаю это в пользовательской роли журнала в Moose (ненужный сложный код удален):

package MyApp::Role::Log;

use Moose::Role;
use Log::Log4perl;

my @methods = qw(
    log trace debug info warn error fatal
    is_trace is_debug is_info is_warn is_error is_fatal
    logexit logwarn error_warn logdie error_die
    logcarp logcluck logcroak logconfess
);

has _logger => (
    is => 'ro',
    isa => 'Log::Log4perl::Logger',
    lazy_build => 1,
    handles => \@methods,
);

around $_ => sub {
    my $orig = shift;
    my $this = shift;

    # one level for this method itself
    # two levels for Class:;MOP::Method::Wrapped (the "around" wrapper)
    # one level for Moose::Meta::Method::Delegation (the "handles" wrapper)
    local $Log::Log4perl::caller_depth;
    $Log::Log4perl::caller_depth += 4;

    my $return = $this->$orig(@_);

    $Log::Log4perl::caller_depth -= 4;
    return $return;

} foreach @methods;

method _build__logger => sub {
    my $this = shift;

    my $loggerName = ref($this);
    Log::Log4perl->easy_init() if not Log::Log4perl::initialized();
    return Log::Log4perl->get_logger($loggerName)
};

Как видите, объект журнала самоинициализируется - если Log :: Log4perl-> init не был вызван, то вызывается easy_init . Вы можете легко изменить это, чтобы позволить каждому модулю настраивать свой регистратор - я делаю это с дополнительными параметрами роли, с ref ($ this) в качестве запасного варианта по умолчанию.

PS. Вы также можете посмотреть MooseX :: Log :: Log4perl , с которого я начал, прежде чем использовать роль регистратора выше. Когда-нибудь, когда я займусь этим, я отправлю несколько столь необходимых исправлений для этого модуля MX, чтобы включить некоторые функции, которые я добавил.

7
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: