File Coverage

blib/lib/Log/Any/Adapter/Multiplexor.pm
Criterion Covered Total %
statement 18 20 90.0
branch n/a
condition n/a
subroutine 7 7 100.0
pod n/a
total 25 27 92.5


line stmt bran cond sub pod time code
1             package Log::Any::Adapter::Multiplexor;
2              
3 1     1   13622 use 5.008001;
  1         4  
4              
5 1     1   6 use strict;
  1         2  
  1         21  
6 1     1   4 use warnings;
  1         6  
  1         26  
7 1     1   451 use utf8;
  1         12  
  1         5  
8 1     1   433 use open qw(:std :utf8);
  1         846  
  1         5  
9 1     1   146 use Carp 'croak';
  1         2  
  1         57  
10 1     1   180 use Log::Any::Adapter;
  0            
  0            
11             #Default adapter
12             Log::Any::Adapter->set('Stdout');
13            
14             our $VERSION = '0.02';
15              
16             my %LOG_LEVELS = (
17             '0' => 'emergency',
18             '1' => 'alert',
19             '2' => 'critical',
20             '3' => 'error',
21             '4' => 'warning',
22             '5' => 'notice',
23             '6' => 'info',
24             '7' => 'debug',
25             '8' => 'trace',
26             );
27              
28             sub new {
29             my $class = shift;
30             my $log = shift;
31             my %opt = @_;
32             my $self = {};
33             $self->{log} = $log;
34             $self->{adapters} = {};
35             $self->{combine} = {};
36             bless $self, $class;
37              
38              
39             for my $key (keys %opt) {
40             my $adapter = shift @{$opt{$key}};
41             my @param = @{$opt{$key}};
42             $self->set_logger($key, $adapter, @param);
43              
44             }
45              
46             $log->{filter} = sub {
47             no strict 'refs';
48             my $log_level_name = $LOG_LEVELS{$_[1]} || 'trace';
49             $self->{adapters}->{$log_level_name}->$log_level_name($_[2]);
50              
51             for my $log_level_combine (keys %{$self->{combine}}) {
52             $self->{adapters}->{$log_level_combine}->$log_level_combine($_[2]) if
53             $log_level_combine ne $log_level_name;
54             }
55             return;
56             };
57              
58             return $self;
59             }
60              
61              
62             sub set_logger {
63             no strict 'refs';
64             my ($self, $log_level, $package, @param) = @_;
65             my $log = $self->{log};
66             $self->{adapters}->{$log_level} = $log->clone();
67             eval "require $package";
68             if ($@) {
69             croak $@;
70             }
71             $self->{adapters}->{$log_level} = $package->new(@param);
72              
73             return 1;
74             }
75              
76             sub combine {
77             my $self = shift;
78             my @param = @_;
79             for my $log_level (@param) {
80             $log_level = lc($log_level);
81             if (not grep {$_ eq $log_level} values %LOG_LEVELS) {
82             croak "Wrong log level: $log_level";
83             }
84             $self->{combine}->{$log_level} = 1;
85             }
86             return 1;
87             }
88              
89             sub uncombine {
90             my $self = shift;
91             $self->{combine} = {};
92             return 1;
93             }
94              
95             1;
96              
97             __END__