Haciendo módulos de auto registro con Log:: Log4perl
logging (2)
Hago esto en una función de registro personalizada en Moose (se elimina el código complicado irrelevante):
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)
};
Como puede ver, el objeto de registro se auto inicializa; si Log::Log4perl->init
no se ha llamado, entonces se llama a easy_init
. Podría modificar esto fácilmente para permitir que cada módulo personalice su registrador; lo hago con los parámetros de función opcionales, con ref($this)
como alternativa predeterminada.
PD. También es posible que desee ver MooseX :: Log :: Log4perl , que es donde comencé antes de usar el rol de registrador anterior. Algún día, cuando lo encuentre, enviaré algunos parches muy necesarios a ese módulo MX para incorporar algunas características que he agregado.
¿Existe alguna forma de utilizar Log :: Log4perl para crear un módulo inteligente de auto registro que registre sus operaciones en un archivo incluso si el script de llamada no está inicializando Log4perl? Por lo que puedo decir de la documentación, la única forma de usar Log4perl es inicializarlo en el script en ejecución desde una configuración, luego los módulos que implementan las llamadas a Log4perl se registran en función de la configuración de Log4perl del llamador.
En cambio, me gustaría que los módulos proporcionen una configuración de inicialización predeterminada para Log4perl. Esto proporcionaría el apéndice de archivo predeterminado para la categoría del módulo. Entonces, podría anular este comportamiento ingresando Log4perl en la persona que llama con una configuración diferente si es necesario, y todo funcionaría con suerte.
¿Es posible este tipo de comportamiento de registro defensivo o voy a necesitar confiar en iniciar Log4perl en cada script .pl que llame al módulo que quiero registrar?
La respuesta corta es llamar a Log :: Log4perl :: initialized (); en algún momento, y si es falso, configure algunos registros predeterminados.
La parte difícil es "algún punto".
No puede hacerlo en BEGIN {}, porque entonces el script principal pisará su inicialización a pesar de que haya creado archivos poco éticos. No desea hacerlo antes de cada llamada a get_logger () porque es un desperdicio. Por lo tanto, debe hacerlo durante la inicialización del módulo, por ejemplo, sub new o sub init.