1 package Log::Contextual::Router;
3 # ABSTRACT: Route messages to loggers
6 use Scalar::Util 'blessed';
8 with 'Log::Contextual::Role::Router',
9 'Log::Contextual::Role::Router::SetLogger',
10 'Log::Contextual::Role::Router::WithLogger';
13 require Log::Log4perl;
14 die if $Log::Log4perl::VERSION < 1.29;
15 Log::Log4perl->wrapper_register(__PACKAGE__)
18 has _default_logger => (
20 default => sub { {} },
24 has _package_logger => (
26 default => sub { {} },
32 default => sub { {} },
39 my ($self, %import_info) = @_;
40 my $exporter = $import_info{exporter};
41 my $target = $import_info{target};
42 my $config = $import_info{arguments};
44 if (my $l = $exporter->arg_logger($config->{logger})) {
45 $self->set_logger($l);
48 if (my $l = $exporter->arg_package_logger($config->{package_logger})) {
49 $self->_set_package_logger_for($target, $l);
52 if (my $l = $exporter->arg_default_logger($config->{default_logger})) {
53 $self->_set_default_logger_for($target, $l);
59 if (ref $logger ne 'CODE') {
60 die 'logger was not a CodeRef or a logger object. Please try again.'
61 unless blessed($logger);
67 local $_[0]->_get_logger->{l} = $logger;
73 if (ref $logger ne 'CODE') {
74 die 'logger was not a CodeRef or a logger object. Please try again.'
75 unless blessed($logger);
82 warn 'set_logger (or -logger) called more than once! This is a bad idea!'
83 if $_[0]->_get_logger->{l};
84 $_[0]->_get_logger->{l} = $logger;
87 sub _set_default_logger_for {
89 if (ref $logger ne 'CODE') {
90 die 'logger was not a CodeRef or a logger object. Please try again.'
91 unless blessed($logger);
97 $_[0]->_default_logger->{$_[1]} = $logger
100 sub _set_package_logger_for {
102 if (ref $logger ne 'CODE') {
103 die 'logger was not a CodeRef or a logger object. Please try again.'
104 unless blessed($logger);
110 $_[0]->_package_logger->{$_[1]} = $logger
114 my ($self, %info) = @_;
115 my $package = $info{caller_package};
116 my $log_level = $info{message_level};
118 ( $_[0]->_package_logger->{$package}
119 || $_[0]->_get_logger->{l}
120 || $_[0]->_default_logger->{$package}
122 q( no logger set! you can't try to log something without a logger! ));
124 $info{caller_level}++;
125 $logger = $logger->($package, \%info);
127 return $logger if $logger ->${\"is_${log_level}"};
131 sub handle_log_request {
132 my ($self, %message_info) = @_;
133 my $generator = $message_info{message_sub};
134 my $args = $message_info{message_args};
135 my $log_level = $message_info{message_level};
137 $message_info{caller_level}++;
139 foreach my $logger ($self->get_loggers(%message_info)) {
140 $logger->$log_level($generator->(@$args));