File Coverage

blib/lib/Logging/Simple.pm
Criterion Covered Total %
statement 180 180 100.0
branch 98 102 96.0
condition 20 24 83.3
subroutine 25 25 100.0
pod 12 12 100.0
total 335 343 97.6


line stmt bran cond sub pod time code
1             package Logging::Simple;
2 16     16   149299 use 5.007;
  16         43  
3 16     16   74 use strict;
  16         20  
  16         379  
4 16     16   59 use warnings;
  16         20  
  16         527  
5              
6 16     16   70 use Carp qw(croak confess);
  16         18  
  16         988  
7 16     16   7818 use POSIX qw(strftime);
  16         104491  
  16         86  
8 16     16   27786 use Time::HiRes qw(time);
  16         20407  
  16         63  
9              
10             our $VERSION = '1.04';
11              
12             BEGIN {
13              
14 129     129   304 sub _sub_names { return [qw(_0 _1 _2 _3 _4 _5 _6 _7)]; };
15 16     16   45 my $sub_names = _sub_names();
16              
17             # build the level subs dynamically. The code in this BEGIN block represents
18             # all logging subs
19              
20             {
21 16     16   3695 no strict 'refs';
  16         19  
  16         3370  
  16         31  
22              
23 16         30 for (@$sub_names) {
24 128         104 my $sub = $_;
25              
26             *$_ = sub {
27 165     165   4468 my ($self, $msg) = @_;
28              
29 165 100       247 return if $self->level == -1;
30              
31 149 100       235 $self->level($ENV{LS_LEVEL}) if defined $ENV{LS_LEVEL};
32              
33 149 50       453 if ($sub =~ /^_(\d)$/) {
34 149 100       185 if (defined $self->_log_only) {
35 32 100       34 return if $1 != $self->_log_only;
36             }
37 121 100       209 return if $1 > $self->level;
38             }
39              
40 106         628 my $proc = join '|', (caller(0))[1..2];
41              
42 106         280 my %log_entry = (
43             label => $sub,
44             proc => $proc,
45             msg => $msg,
46             );
47 106         210 $self->_generate_entry(%log_entry);
48             }
49 128         26680 }
50             }
51             }
52             sub new {
53 51     51 1 37145 my ($class, %args) = @_;
54              
55 51         109 my $self = bless {}, $class;
56              
57 51 100       134 if (defined $args{level}) {
58 12         27 $self->level($args{level});
59             }
60             else {
61 39 100       103 my $lvl = defined $ENV{LS_LEVEL} ? $ENV{LS_LEVEL} : 4;
62 39         96 $self->level($lvl);
63             }
64              
65 51 100       130 if ($args{file}){
66 5         16 $self->file($args{file}, $args{write_mode});
67             }
68              
69 51 100       106 my $print = defined $args{print} ? $args{print} : 1;
70 51         112 $self->print($print);
71              
72 51         126 $self->display(
73             time => 1,
74             label => 1,
75             name => 1,
76             pid => 0,
77             proc => 0,
78             );
79              
80 51 100       109 if (defined $args{display}){
81 3         9 $self->display($args{display});
82             }
83              
84 51         160 $self->name($args{name});
85              
86 51         156 return $self;
87             }
88             sub level {
89 367     367 1 1924 my ($self, $level) = @_;
90              
91 367         474 my %levels = $self->levels;
92              
93 367 100       742 $self->{level} = $ENV{LS_LEVEL} if defined $ENV{LS_LEVEL};
94 367         241 my $lvl;
95              
96 367 100 100     989 if (defined $level && $level =~ /^-1$/){
    100          
97 2         4 $self->{level} = $level;
98             }
99             elsif (defined $level){
100 69         66 my $log_only;
101              
102 69 100       154 if ($level =~ /^=/){
103 4         14 $level =~ s/=//;
104 4         4 $log_only = 1;
105             }
106 69 100 66     379 if ($level =~ /^\d$/ && defined $levels{$level}){
107 68         100 $self->{level} = $level;
108             }
109             else {
110 1         18 warn "invalid level $level specified, using default of 4\n";
111             }
112              
113 69 100       105 if ($log_only){
114 4         6 $self->_log_only($self->{level});
115             }
116             else {
117 65         118 $self->_log_only(-1);
118             }
119             }
120              
121 367         1055 return $self->{level};
122             }
123             sub file {
124 27     27 1 4279 my ($self, $file, $mode) = @_;
125              
126 27 100       50 if (! defined $file){
127 1         2 return $self->{file};
128             }
129 26 100       79 if ($file =~ /^0$/){
130 7 50       113 if (tell($self->{fh}) != -1) {
131 7         103 close $self->{fh};
132             }
133 7         13 delete $self->{file};
134 7         17 delete $self->{fh};
135 7         14 return;
136             }
137 19 100 33     108 if (defined $file && $self->{file} && $file ne $self->{file}){
      66        
138 8         208 close $self->{fh};
139             }
140 19 100       38 $mode = 'a' if ! defined $mode;
141 19 100       55 my $op = $mode =~ /^a/ ? '>>' : '>';
142              
143 19 50       1024 open $self->{fh}, $op, $file or croak "can't open log file for writing: $!";
144 19         35 $self->{file} = $file;
145              
146 19         43 return $self->{file};
147             }
148             sub name {
149 304     304 1 315 my ($self, $name) = @_;
150 304 100       415 $self->{name} = $name if defined $name;
151 304         803 return $self->{name};
152             }
153             sub timestamp {
154 51     51 1 113 my $t = time;
155 51         3893 my $date = strftime "%Y-%m-%d %H:%M:%S", localtime $t;
156 51         284 $date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
157 51         120 return $date;
158             }
159             sub levels {
160 490     490 1 7842 my ($self, $lvl) = @_;
161              
162 490         594 my %levels = $self->_levels;
163              
164 490 100       1027 return $levels{$lvl} if defined $lvl;
165 372         1390 return %levels;
166             }
167             sub labels {
168 2     2 1 6306 my ($self, $labels) = @_;
169 2         6 $self->_levels($labels);
170             }
171             sub display {
172 632     632 1 2803 my $self = shift;
173 632         410 my ($tag, %tags);
174              
175 632 100       681 if (@_ == 1){
176 568         446 $tag = shift;
177             }
178             else {
179 64         172 %tags = @_;
180             }
181              
182 632 100       778 if (defined $tag){
183 568 100       794 if ($tag =~ /^0$/){
184 6         7 for (keys %{ $self->{display} }){
  6         22  
185 30         28 $self->{display}{$_} = 0;
186             }
187 6         16 return 0;
188             }
189 562 100       651 if ($tag =~ /^1$/){
190 4         4 for (keys %{ $self->{display} }){
  4         13  
191 20         18 $self->{display}{$_} = 1;
192             }
193 4         10 return 1;
194             }
195              
196 558         1333 return $self->{display}{$tag};
197             }
198              
199 64         159 my %valid = (
200             name => 0,
201             time => 0,
202             label => 0,
203             pid => 0,
204             proc => 0,
205             );
206              
207 64         165 for (keys %tags) {
208 267 100       386 if (! defined $valid{$_}){
209 1         16 warn "$_ is an invalid tag...skipping\n";
210 1         5 next;
211             }
212 266         322 $self->{display}{$_} = $tags{$_};
213             }
214              
215 64         74 return %{ $self->{display} };
  64         160  
216             }
217             sub print {
218 167 100   167 1 916 $_[0]->{print} = $_[1] if defined $_[1];
219 167         496 return $_[0]->{print};
220             }
221             sub child {
222 29     29 1 109 my ($self, $name) = @_;
223 29         141 my $child = bless { %$self }, ref $self;
224 29 100       42 $name = $self->name . ".$name" if defined $self->name;
225 29         35 $child->name($name);
226 29         34 return $child;
227             }
228             sub custom_display {
229 114     114 1 382 my ($self, $disp) = @_;
230              
231 114 100       172 if (defined $disp) {
232 2 100       28 if ($disp =~ /^0$/) {
233 1         2 delete $self->{custom_display};
234 1         2 return 0;
235             }
236             else {
237 1         3 $self->{custom_display} = $disp;
238             }
239             }
240 113         184 return $self->{custom_display};
241             }
242             sub fatal {
243 1     1 1 6 my ($self, $msg) = @_;
244 1         2 $self->display(1);
245 1         5 confess("\n" . $self->_0("$msg"));
246             }
247             sub _generate_entry {
248             # builds/formats the log entry line
249              
250 111     111   116 my $self = shift;
251 111         161 my %entry = @_;
252              
253 111         114 my $label = $entry{label};
254 111         97 my $proc = $entry{proc};
255 111         91 my $msg = $entry{msg};
256              
257 111         166 my $subs = $self->_sub_names;
258 111 100       138 if (! grep { $label eq $_ } @$subs){
  888         980  
259 1         157 croak "_generate_entry() requires a label => sub/label param\n";
260             }
261              
262 110         270 $label =~ s/_//;
263 110         158 $label = $self->levels($label);
264              
265 110 100       210 $msg = $msg ? "$msg\n" : "\n";
266              
267 110         80 my $log_entry;
268 110 100       152 $log_entry .= $self->custom_display if defined $self->custom_display;
269 110 100       144 $log_entry .= "[".$self->timestamp()."]" if $self->display('time');
270 110 100       154 $log_entry .= "[$label]" if $self->display('label');
271 110 100 100     139 $log_entry .= "[".$self->name."]" if $self->display('name') && $self->name;
272 110 100       144 $log_entry .= "[$$]" if $self->display('pid');
273 110 100       141 $log_entry .= "[$proc]" if $self->display('proc');
274 110 100       176 $log_entry .= " " if $log_entry;
275 110         88 $log_entry .= $msg;
276              
277 110 100       133 return $log_entry if ! $self->print;
278              
279 47 100       62 if ($self->{fh}){
280 45         30 print { $self->{fh} } $log_entry;
  45         220  
281             }
282             else {
283 2         221 print $log_entry;
284             }
285             }
286             sub _levels {
287             # manages the level labels
288              
289 492     492   370 my ($self, $labels) = @_;
290              
291 492 100       850 if (ref $labels eq 'ARRAY'){
292 1 50       3 croak "must supply exactly 8 custom labels\n" if @$labels != 8;
293 1         3 my %custom_levels = map {$_ => $labels->[$_]} (0..7);
  8         17  
294 1         3 $self->{labels} = \%custom_levels;
295             }
296              
297 492 100 100     2001 if (defined $labels && $labels == 0 || ! defined $self->{labels}) {
      100        
298             $self->{labels} = {
299 52         362 0 => 'lvl 0',
300             1 => 'lvl 1',
301             2 => 'lvl 2',
302             3 => 'lvl 3',
303             4 => 'lvl 4',
304             5 => 'lvl 5',
305             6 => 'lvl 6',
306             7 => 'lvl 7',
307             };
308             }
309 492         356 return %{ $self->{labels} };
  492         2195  
310             }
311             sub _log_only {
312             # are we logging only one level or not?
313              
314 250     250   218 my ($self, $level) = @_;
315 250 100 100     589 if (defined $level && $level == -1){
316 65         94 $self->{log_only} = undef;
317             }
318             else {
319 185 100       225 $self->{log_only} = $level if defined $level;
320             }
321 250         686 return $self->{log_only};
322             }
323              
324             1;
325             __END__