File Coverage

blib/lib/Log/OK.pm
Criterion Covered Total %
statement 26 99 26.2
branch 7 64 10.9
condition 0 23 0.0
subroutine 7 11 63.6
pod 0 6 0.0
total 40 203 19.7


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