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