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