File Coverage

blib/lib/Log/OK.pm
Criterion Covered Total %
statement 38 111 34.2
branch 7 62 11.2
condition 0 23 0.0
subroutine 11 15 73.3
pod 0 6 0.0
total 56 217 25.8


line stmt bran cond sub pod time code
1             package Log::OK;
2              
3 1     1   68576 use strict;
  1         2  
  1         30  
4 1     1   5 use warnings;
  1         2  
  1         26  
5 1     1   442 use version; our $VERSION=version->declare("v0.1.6");
  1         1875  
  1         5  
6              
7 1     1   102 use Carp qw;
  1         2  
  1         52  
8 1     1   458 use constant::more ();
  1         1318  
  1         25  
9              
10 1     1   7 use constant DEBUG_=>0; #Heh...
  1         2  
  1         88  
11              
12 1     1   7 use feature qw"say state";
  1         1  
  1         114  
13              
14             my %systems=(
15             "Log::Any"=>\&log_any,
16             "Log::ger"=>\&log_ger,
17             "Log::Log4perl"=>\&log_log4perl,
18             "Log::Dispatch"=>\&log_dispatch
19             );
20              
21              
22             my $sub;
23 1     1   7 use constant::more();
  1         2  
  1         1489  
24             sub import {
25             #arguments are lvl , opt, env, cat in hash ref
26 1     1   9 my $p=shift;
27 1         1 my $hr=shift;
28              
29             #return unless $hr;
30 1 50       4 $hr={} unless $hr;
31              
32 1         3 my $caller=caller;
33            
34 1 50       3 if($hr->{sys}){
35             #manual selection of logging system
36 0         0 $sub=$systems{$hr->{sys}};
37 0 0       0 croak "Unsupported logging system" unless $sub;
38             }
39             else{
40             #attempt to auto detect the logging system
41 1         3 $sub=auto_detect();
42             }
43             constant::more->import({
44             logging=>{
45             val=>$hr->{lvl},
46             opt=>$hr->{opt}?$hr->{opt}.":s" : undef,
47             env=>$hr->{env},
48             sys=>$hr->{sys},
49 1 50       9 sub=>$sub,
50             }
51             });
52             };
53              
54             sub auto_detect {
55             #check for Log::Any first
56 1 50   1 0 3 (%Log::Any:: )and return \&log_any;
57 1 50       2 (%Log::ger::) and return \&log_ger;
58 1 50       3 (%Log::Dispatch::) and return \&log_dispatch;
59 1 50       2 (%Log::Log4perl::) and return \&log_log4perl;
60              
61             #otherwise fallback to log any
62             #\&log_dispatch;
63 1         3 \&no_logger;
64             }
65              
66             sub log_any {
67 0     0 0 0 DEBUG_ and say STDERR "setup for Log::Any";
68 0         0 my ($opt, $value)=@_;
69 0         0 state $lookup= {
70              
71             EMERGENCY => 0,
72             ALERT => 1,
73             CRITICAL => 2,
74             ERROR => 3,
75             ERR => 3,
76             WARNING => 4,
77             WARN => 4,
78             NOTICE => 5,
79             INFO => 6,
80             INFORM => 6,
81             DEBUG => 7,
82             TRACE => 8,
83             };
84 0         0 state $level=0;
85 0   0     0 $value//="EMERGENCY"; #Default if undefined
86 0 0 0     0 $value=1 if $value eq "" or $value eq 0;
87 0         0 for(uc($value)){
88             #test numeric. Should only be used for incremental
89 0 0       0 if(/\d/){
90             #assume number
91 0         0 $level+=$_;
92 0 0       0 $level=0 if $level< 0;
93 0 0       0 $level=8 if $level> 8;
94             }
95             else{
96            
97 0         0 $level=$lookup->{$_};
98 0 0       0 carp "Log::OK: unknown level \"$value\" for Log::Any. Valid options: ".join ', ', keys %$lookup unless defined $level;
99             }
100             }
101              
102 0         0 DEBUG_ and say STDERR "Level input $value";
103 0         0 DEBUG_ and say STDERR "Level output $level";
104              
105             (
106             #Contants to define
107 0         0 "Log::OK::EMERGENCY"=>$level>=0,
108             "Log::OK::ALERT"=>$level>=1,
109             "Log::OK::CRITICAL"=>$level>=2,
110             "Log::OK::ERROR"=>$level>=3,
111             "Log::OK::ERR"=>$level>=3,
112             "Log::OK::WARNING"=>$level>=4,
113             "Log::OK::WARN"=>$level>=4,
114             "Log::OK::NOTICE"=>$level>=5,
115             "Log::OK::INFO"=>$level>=6,
116             "Log::OK::INFORM"=>$level>=6,
117             "Log::OK::DEBUG"=>$level>=7,
118             "Log::OK::TRACE"=>$level>=8,
119              
120             "Log::OK::LEVEL"=>$value
121             )
122             }
123              
124             sub log_ger {
125            
126 0     0 0 0 DEBUG_ and say STDERR "setup for Log::ger";
127 0         0 my ($opt, $value)=@_;
128 0         0 state $unset=1;
129 0         0 state $lookup={
130             fatal => 10,
131             error => 20,
132             warn => 30,
133             info => 40,
134             debug => 50,
135             trace => 60,
136             };
137 0         0 state $level=10;
138 0   0     0 $value//="fatal"; #Default if undefined
139 0 0 0     0 $value=1 if $value eq "" or $value eq 0;
140 0         0 for(lc($value)){
141             #test numeric
142 0 0       0 if(/\d/){
143             #assume number
144 0         0 $level+=$_*10;
145 0 0       0 $level=10 if $level < 10;
146 0 0       0 $level=60 if $level > 60;
147             }
148             else{
149 0         0 $level=$lookup->{$_};
150 0 0       0 carp "Log::OK: unknown level \"$value\" for Log::ger. Valid options: ".join ', ', keys %$lookup unless defined $level;
151             }
152             }
153              
154             #
155             # Update the level in Log::ger only when the constant exists and for the first time only
156             #
157 0 0 0     0 if(*Log::OK::LEVEL{CODE} and $unset){
158 0         0 $unset=undef;
159 0         0 my $message= "Log::OK could not automatically sync log levels with your logger";
160 0 0       0 carp $message unless eval "
161             require Log::ger::Util;
162             Log::ger::Util::set_level(Log::OK::LEVEL);
163             1;
164             ";
165             }
166              
167             (
168             #TODO: these values don't work well with
169             #incremental logging levels from the command line
170            
171 0         0 "Log::OK::FATAL"=>$level>=10,
172             "Log::OK::ERROR"=>$level>=20,
173             "Log::OK::WARN"=>$level>=30,
174             "Log::OK::INFO"=>$level>=40,
175             "Log::OK::DEBUG"=>$level>=50,
176             "Log::OK::TRACE"=>$level>=60,
177              
178             "Log::OK::LEVEL"=>$level
179             )
180              
181             }
182              
183             sub log_dispatch {
184 0     0 0 0 DEBUG_ and say STDERR "setup for Log::Dispatch";
185 0         0 my ($opt, $value)=@_;
186 0         0 state $lookup={
187             debug=>0,
188             info=>1,
189             notice=>2,
190             warning=>3,
191             error=>4,
192             critical=>5,
193             alert=>6,
194             emergency=>7,
195              
196             #aliases
197             warn=>3,
198             err=>4,
199             crit=>5,
200             emerg=>7
201             };
202 0         0 state $level;
203 0   0     0 $value//="emergency"; #Default if undefined
204 0 0 0     0 $value=1 if $value eq "" or $value eq 0;
205 0         0 for(lc($value)){
206             #test numeric
207 0 0       0 if(/\d/){
208             #assume number
209 0         0 $level-=$_;
210 0 0       0 $level=0 if $level < 0;
211 0 0       0 $level=7 if $level > 7;
212             }
213             else{
214            
215 0         0 $level=$lookup->{$_};
216 0 0       0 carp "Log::OK: unknown level \"$value\" for Log::Dispatch. Valid options: ".join ', ', keys %$lookup unless defined $level;
217             }
218             }
219              
220              
221              
222              
223             (
224             #TODO: these values don't work well with
225             #incremental logging levels from the command line
226              
227 0         0 "Log::OK::EMERGENCY"=>$level<=7,
228             "Log::OK::EMERG"=>$level<=7,
229             "Log::OK::ALERT"=>$level<=6,
230             "Log::OK::CRITICAL"=>$level<=5,
231             "Log::OK::CRIT"=>$level<=5,
232             "Log::OK::ERROR"=>$level<=4,
233             "Log::OK::ERR"=>$level<=4,
234             "Log::OK::WARNING"=>$level<=3,
235             "Log::OK::WARN"=>$level<=3,
236             "Log::OK::NOTICE"=>$level<=2,
237             "Log::OK::INFO"=>$level<=1,
238             "Log::OK::DEBUG"=>$level<=0,
239              
240             "Log::OK::LEVEL"=>$level
241             )
242              
243              
244             }
245              
246             sub log_log4perl {
247 0     0 0 0 DEBUG_ and say STDERR "setup for Log::Log4perl";
248              
249 0         0 my ($opt, $value)=@_;
250 0         0 state $lookup={
251              
252             ALL => 0,
253             TRACE => 5000,
254             DEBUG => 10000,
255             INFO => 20000,
256             WARN => 30000,
257             ERROR => 40000,
258             FATAL => 50000,
259             OFF => (2 ** 31) - 1
260             };
261              
262 0         0 state $levels=[ 0,5000,10000,20000,30000,40000,50000,(2**31)-1];
263              
264 0         0 DEBUG_ and say STDERR "";
265 0         0 DEBUG_ and say STDERR "VALUE: $value";
266 0         0 my $level;
267 0         0 state $index=@$levels-1;
268              
269 0   0     0 $value//="FATAL"; #Default if undefined
270 0 0 0     0 $value=1 if $value eq "" or $value eq 0;
271              
272 0         0 for(uc($value)){
273             #test numeric
274 0 0       0 if(/\d/){
275             #assume number
276 0         0 $index-=$_;
277 0 0       0 $index=0 if $index< 0;
278 0 0       0 $index=@$levels-1 if $index > @$levels-1;
279 0         0 $level=$levels->[$index];
280 0 0       0 carp "Log::OK: unknown level \"$value\" for Log::Log4perl" unless grep $level==$_, @$levels;
281              
282             }
283             else{
284 0         0 $level=$lookup->{$_};
285              
286 0 0       0 carp "Log::OK: unknown level \"$value\" for Log::Log4perl. Valid options: ".join ', ', keys %$lookup unless defined $level;
287 0         0 ($index)=grep $levels->[$_]==$level, 0..@$levels-1;
288             }
289             }
290              
291              
292 0         0 DEBUG_ and say STDERR "LEVEL: $level";
293              
294             (
295             #TODO: these values don't work well with
296             #incremental logging levels from the command line
297              
298             "Log::OK::OFF"=>$level<=$lookup->{OFF},
299 0         0 "Log::OK::FATAL"=>$level<=50000,
300             "Log::OK::ERROR"=>$level<=40000,
301             "Log::OK::WARN"=>$level<=30000,
302             "Log::OK::INFO"=>$level<=20000,
303             "Log::OK::DEBUG"=>$level<=10000,
304             "Log::OK::TRACE"=>$level<=5000,
305             "Log::OK::ALL"=>$level<=0,
306              
307             "Log::OK::LEVEL"=> $level
308             )
309             }
310              
311             #Define all supported constants as false.
312             sub no_logger {
313 1     1 0 34 DEBUG_ and say STDERR "NO LOGGER DETECTED";
314             (
315 1         6 "Log::OK::OFF"=>0,
316             "Log::OK::FATAL"=>0,
317             "Log::OK::ERROR"=>0,
318             "Log::OK::INFO"=>0,
319             "Log::OK::DEBUG"=>0,
320             "Log::OK::TRACE"=>0,
321             "Log::OK::ALL"=>0,
322              
323              
324             "Log::OK::EMERGENCY"=>0,
325             "Log::OK::EMERG"=>0,
326             "Log::OK::ALERT"=>0,
327             "Log::OK::CRITICAL"=>0,
328             "Log::OK::CRIT"=>0,
329             "Log::OK::ERR"=>0,
330             "Log::OK::WARNING"=>0,
331             "Log::OK::NOTICE"=>0,
332              
333             "Log::OK::FATAL"=>0,
334              
335             "Log::OK::INFORM"=>0,
336              
337             "Log::OK::WARN"=>0,
338              
339             "Log::OK::LEVEL"=> 0
340             )
341              
342             }
343              
344             1;