v0.006004
[p5sagit/Log-Contextual.git] / lib / Log / Contextual / Router.pm
CommitLineData
8112b699 1package Log::Contextual::Router;
2
048136f2 3# ABSTRACT: Route messages to loggers
4
8112b699 5use Moo;
6use Scalar::Util 'blessed';
7
1df0e2c4 8with 'Log::Contextual::Role::Router',
6ae293d7 9 'Log::Contextual::Role::Router::SetLogger',
10 'Log::Contextual::Role::Router::WithLogger';
8112b699 11
8527bf52 12eval {
13 require Log::Log4perl;
14 die if $Log::Log4perl::VERSION < 1.29;
15 Log::Log4perl->wrapper_register(__PACKAGE__)
16};
17
1ed6e521 18has _default_logger => (
6ae293d7 19 is => 'ro',
20 default => sub { {} },
1ed6e521 21 init_arg => undef,
22);
23
24has _package_logger => (
6ae293d7 25 is => 'ro',
26 default => sub { {} },
1ed6e521 27 init_arg => undef,
28);
29
30has _get_logger => (
6ae293d7 31 is => 'ro',
32 default => sub { {} },
1ed6e521 33 init_arg => undef,
34);
35
8112b699 36sub before_import { }
37
38sub after_import {
a5454e75 39 my ($self, %import_info) = @_;
40 my $exporter = $import_info{exporter};
6ae293d7 41 my $target = $import_info{target};
42 my $config = $import_info{arguments};
1ed6e521 43
a5454e75 44 if (my $l = $exporter->arg_logger($config->{logger})) {
45 $self->set_logger($l);
8112b699 46 }
47
a5454e75 48 if (my $l = $exporter->arg_package_logger($config->{package_logger})) {
49 $self->_set_package_logger_for($target, $l);
8112b699 50 }
51
a5454e75 52 if (my $l = $exporter->arg_default_logger($config->{default_logger})) {
53 $self->_set_default_logger_for($target, $l);
8112b699 54 }
55}
56
57sub with_logger {
58 my $logger = $_[1];
6ae293d7 59 if (ref $logger ne 'CODE') {
8112b699 60 die 'logger was not a CodeRef or a logger object. Please try again.'
6ae293d7 61 unless blessed($logger);
62 $logger = do {
63 my $l = $logger;
64 sub { $l }
65 }
8112b699 66 }
1ed6e521 67 local $_[0]->_get_logger->{l} = $logger;
8112b699 68 $_[2]->();
69}
70
71sub set_logger {
72 my $logger = $_[1];
6ae293d7 73 if (ref $logger ne 'CODE') {
8112b699 74 die 'logger was not a CodeRef or a logger object. Please try again.'
6ae293d7 75 unless blessed($logger);
76 $logger = do {
77 my $l = $logger;
78 sub { $l }
79 }
8112b699 80 }
81
82 warn 'set_logger (or -logger) called more than once! This is a bad idea!'
6ae293d7 83 if $_[0]->_get_logger->{l};
1ed6e521 84 $_[0]->_get_logger->{l} = $logger;
8112b699 85}
86
87sub _set_default_logger_for {
88 my $logger = $_[2];
6ae293d7 89 if (ref $logger ne 'CODE') {
8112b699 90 die 'logger was not a CodeRef or a logger object. Please try again.'
6ae293d7 91 unless blessed($logger);
92 $logger = do {
93 my $l = $logger;
94 sub { $l }
95 }
8112b699 96 }
1ed6e521 97 $_[0]->_default_logger->{$_[1]} = $logger
8112b699 98}
99
100sub _set_package_logger_for {
101 my $logger = $_[2];
6ae293d7 102 if (ref $logger ne 'CODE') {
8112b699 103 die 'logger was not a CodeRef or a logger object. Please try again.'
6ae293d7 104 unless blessed($logger);
105 $logger = do {
106 my $l = $logger;
107 sub { $l }
108 }
8112b699 109 }
1ed6e521 110 $_[0]->_package_logger->{$_[1]} = $logger
8112b699 111}
112
113sub get_loggers {
a5454e75 114 my ($self, %info) = @_;
6ae293d7 115 my $package = $info{caller_package};
a5454e75 116 my $log_level = $info{message_level};
6ae293d7 117 my $logger =
118 ( $_[0]->_package_logger->{$package}
119 || $_[0]->_get_logger->{l}
120 || $_[0]->_default_logger->{$package}
121 || die
122 q( no logger set! you can't try to log something without a logger! ));
8112b699 123
8527bf52 124 $info{caller_level}++;
8527bf52 125 $logger = $logger->($package, \%info);
126
6ae293d7 127 return $logger if $logger ->${\"is_${log_level}"};
8527bf52 128 return ();
129}
130
131sub handle_log_request {
a5454e75 132 my ($self, %message_info) = @_;
133 my $generator = $message_info{message_sub};
6ae293d7 134 my $args = $message_info{message_args};
a5454e75 135 my $log_level = $message_info{message_level};
8527bf52 136
a5454e75 137 $message_info{caller_level}++;
8527bf52 138
a5454e75 139 foreach my $logger ($self->get_loggers(%message_info)) {
140 $logger->$log_level($generator->(@$args));
8527bf52 141 }
8112b699 142}
143
8527bf52 1441;
8112b699 145