File Coverage

lib/Log/Mini/Logger/Base.pm
Criterion Covered Total %
statement 69 71 97.1
branch 12 12 100.0
condition 2 2 100.0
subroutine 18 20 90.0
pod 0 12 0.0
total 101 117 86.3


line stmt bran cond sub pod time code
1             package Log::Mini::Logger::Base;
2              
3 6     6   197171 use strict;
  6         13  
  6         207  
4 6     6   43 use warnings;
  6         10  
  6         337  
5              
6 6     6   32 use Carp qw(croak);
  6         10  
  6         427  
7 6     6   43 use Time::HiRes;
  6         8  
  6         1550  
8              
9              
10             my $LEVELS = {
11             error => 1,
12             warn => 2,
13             info => 3,
14             debug => 4,
15             trace => 5,
16             };
17              
18             sub new
19             {
20 46     46 0 777231 my $class = shift;
21 46         151 my (%params) = @_;
22              
23 46         102 my $self = {};
24 46         100 bless $self, $class;
25              
26 46   100     281 $self->{'level'} = $params{'level'} || 'error';
27              
28 46         115 $self->{_context} = [];
29 46         92 $self->{_context_string} = '';
30              
31 46         175 return $self;
32             }
33              
34             sub set_level
35             {
36 37     37 0 13577 my $self = shift;
37 37         87 my ($new_level) = @_;
38              
39             croak('Unknown log level')
40 37 100       317 unless $LEVELS->{$new_level};
41              
42 36         74 $self->{'level'} = $new_level;
43              
44 36         72 return 1;
45             }
46              
47             sub level
48             {
49 2     2 0 19 my $self = shift;
50              
51 2         13 return $self->{level};
52             }
53              
54 0     0 0 0 sub log { return shift->_log(@_) }
55 10     10 0 3307 sub info { return shift->_log('info', @_) }
56 26     26 0 1008926 sub error { return shift->_log('error', @_) }
57 16     16 0 17507 sub warn { return shift->_log('warn', @_) }
58 16     16 0 16793 sub debug { return shift->_log('debug', @_) }
59 10     10 0 2126 sub trace { return shift->_log('trace', @_) }
60              
61             sub push_context {
62 5     5 0 17 my $self = shift;
63 5         10 my ($context_string) = @_;
64              
65 5 100       35 return unless $context_string;
66            
67 4         6 push @{$self->{_context}}, $context_string;
  4         9  
68              
69 4         10 $self->{_context_string} = $self->_build_context_string();
70              
71 4         13 return 1;
72             }
73              
74             sub pop_context {
75 3     3 0 9 my $self = shift;
76              
77 3 100       5 return unless scalar @{$self->{_context}};
  3         19  
78              
79 2         4 pop @{$self->{_context}};
  2         6  
80              
81 2 100       3 if (scalar @{$self->{_context}}) {
  2         7  
82 1         3 $self->{_context_string} = $self->_build_context_string();
83             }
84             else {
85 1         3 $self->{_context_string} = '';
86             }
87              
88 2         11 return 1;
89             }
90              
91             sub clear_context {
92 1     1 0 2 my $self = shift;
93              
94 1         4 $self->{_context} = [];
95 1         10 $self->{_context_string} = '';
96              
97 1         3 return 1;
98             }
99              
100             sub _build_context_string {
101 5     5   9 my $self = shift;
102              
103 5         7 my $context_string = ' '.join ' ', @{$self->{_context}};
  5         17  
104 5         26 $context_string .= ':';
105              
106 5         13 return $context_string;
107             }
108              
109             sub _log
110             {
111 78     78   141 my $self = shift;
112 78         126 my $level = shift;
113 78         189 my $message = shift;
114              
115 78 100       378 return if $LEVELS->{$level} > $LEVELS->{$self->{'level'}};
116            
117 68         201 my $text = sprintf("%s [%s]%s %s\n", $self->_getCurrentTime(), $level, $self->{_context_string}, $message);
118 68 100       277 $text = sprintf($text, @_) if (@_);
119              
120 68         284 $self->_print($text);
121              
122 68         404 return 1;
123             }
124              
125 0     0   0 sub _print { croak 'Not implemented!' }
126              
127             sub _getCurrentTime
128             {
129 68     68   281 my ($seconds, $milliseconds) = Time::HiRes::gettimeofday();
130              
131 68         1422 my ($sec,$min,$hour,$mday,$mon,$year) = localtime($seconds);
132              
133 68         1952 return sprintf('%i-%02i-%02i %02i:%02i:%02i.%03i', 1900+$year, ++$mon, $mday, $hour, $min, $sec, substr($milliseconds, 0, 3));
134             }
135              
136             1;