File Coverage

blib/lib/Log/OK.pm
Criterion Covered Total %
statement 35 108 32.4
branch 7 64 10.9
condition 0 23 0.0
subroutine 10 14 71.4
pod 0 6 0.0
total 52 215 24.1


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