1 package Log::Contextual::Router;
4 use Scalar::Util 'blessed';
6 with 'Log::Contextual::Role::Router',
7 'Log::Contextual::Role::Router::SetLogger',
8 'Log::Contextual::Role::Router::WithLogger';
11 require Log::Log4perl;
12 die if $Log::Log4perl::VERSION < 1.29;
13 Log::Log4perl->wrapper_register(__PACKAGE__)
16 has _default_logger => (
18 default => sub { {} },
22 has _package_logger => (
24 default => sub { {} },
30 default => sub { {} },
37 my ($self, %import_info) = @_;
38 my $exporter = $import_info{exporter};
39 my $target = $import_info{target};
40 my $config = $import_info{arguments};
42 if (my $l = $exporter->arg_logger($config->{logger})) {
43 $self->set_logger($l);
46 if (my $l = $exporter->arg_package_logger($config->{package_logger})) {
47 $self->_set_package_logger_for($target, $l);
50 if (my $l = $exporter->arg_default_logger($config->{default_logger})) {
51 $self->_set_default_logger_for($target, $l);
57 if (ref $logger ne 'CODE') {
58 die 'logger was not a CodeRef or a logger object. Please try again.'
59 unless blessed($logger);
65 local $_[0]->_get_logger->{l} = $logger;
71 if (ref $logger ne 'CODE') {
72 die 'logger was not a CodeRef or a logger object. Please try again.'
73 unless blessed($logger);
80 warn 'set_logger (or -logger) called more than once! This is a bad idea!'
81 if $_[0]->_get_logger->{l};
82 $_[0]->_get_logger->{l} = $logger;
85 sub _set_default_logger_for {
87 if (ref $logger ne 'CODE') {
88 die 'logger was not a CodeRef or a logger object. Please try again.'
89 unless blessed($logger);
95 $_[0]->_default_logger->{$_[1]} = $logger
98 sub _set_package_logger_for {
100 if (ref $logger ne 'CODE') {
101 die 'logger was not a CodeRef or a logger object. Please try again.'
102 unless blessed($logger);
108 $_[0]->_package_logger->{$_[1]} = $logger
112 my ($self, %info) = @_;
113 my $package = $info{caller_package};
114 my $log_level = $info{message_level};
116 ( $_[0]->_package_logger->{$package}
117 || $_[0]->_get_logger->{l}
118 || $_[0]->_default_logger->{$package}
120 q( no logger set! you can't try to log something without a logger! ));
122 $info{caller_level}++;
123 $logger = $logger->($package, \%info);
125 return $logger if $logger ->${\"is_${log_level}"};
129 sub handle_log_request {
130 my ($self, %message_info) = @_;
131 my $generator = $message_info{message_sub};
132 my $args = $message_info{message_args};
133 my $log_level = $message_info{message_level};
135 $message_info{caller_level}++;
137 foreach my $logger ($self->get_loggers(%message_info)) {
138 $logger->$log_level($generator->(@$args));