Commit | Line | Data |
8112b699 |
1 | package Log::Contextual::Router; |
2 | |
048136f2 |
3 | # ABSTRACT: Route messages to loggers |
4 | |
8112b699 |
5 | use Moo; |
6 | use Scalar::Util 'blessed'; |
7 | |
1df0e2c4 |
8 | with 'Log::Contextual::Role::Router', |
6ae293d7 |
9 | 'Log::Contextual::Role::Router::SetLogger', |
10 | 'Log::Contextual::Role::Router::WithLogger'; |
8112b699 |
11 | |
8527bf52 |
12 | eval { |
13 | require Log::Log4perl; |
14 | die if $Log::Log4perl::VERSION < 1.29; |
15 | Log::Log4perl->wrapper_register(__PACKAGE__) |
16 | }; |
17 | |
1ed6e521 |
18 | has _default_logger => ( |
6ae293d7 |
19 | is => 'ro', |
20 | default => sub { {} }, |
1ed6e521 |
21 | init_arg => undef, |
22 | ); |
23 | |
24 | has _package_logger => ( |
6ae293d7 |
25 | is => 'ro', |
26 | default => sub { {} }, |
1ed6e521 |
27 | init_arg => undef, |
28 | ); |
29 | |
30 | has _get_logger => ( |
6ae293d7 |
31 | is => 'ro', |
32 | default => sub { {} }, |
1ed6e521 |
33 | init_arg => undef, |
34 | ); |
35 | |
8112b699 |
36 | sub before_import { } |
37 | |
38 | sub 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 | |
57 | sub 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 | |
71 | sub 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 | |
87 | sub _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 | |
100 | sub _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 | |
113 | sub 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 | |
131 | sub 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 |
144 | 1; |
8112b699 |
145 | |