File Coverage

blib/lib/glog/logger.pm
Criterion Covered Total %
statement 62 63 98.4
branch 25 36 69.4
condition 13 22 59.0
subroutine 15 15 100.0
pod 0 10 0.0
total 115 146 78.7


line stmt bran cond sub pod time code
1             package glog::logger;
2 2     2   110627 use strict;
  2         3  
  2         88  
3 2     2   10 use warnings;
  2         9  
  2         122  
4 2     2   12 use Time::HiRes qw(gettimeofday);
  2         3  
  2         18  
5 2     2   200 use POSIX qw(strftime);
  2         3  
  2         13  
6 2     2   1315 use gerr qw(Die);
  2         5367  
  2         11  
7              
8             our $VERSION = '1.0.5';
9              
10             my %LEVEL_NAMES = (
11             1 => 'ERROR',
12             2 => 'WARN',
13             3 => 'INFO',
14             5 => 'DEBUG',
15             );
16              
17             sub new {
18 9     9 0 219911 my ($class) = @_;
19 9         31 return bless {
20             level => 3,
21             fh => undef,
22             }, $class;
23             }
24              
25             sub LogLevel {
26 14     14 0 3342 my ($self, $new_level) = @_;
27 14 100       39 if (defined $new_level) {
28 12 100 66     52 if ($new_level < 0 || $new_level > 9) {
29 2         9 Die "Log level must be between 0 and 9";
30             }
31 12         779 $self->{level} = $new_level;
32             }
33 14         33 return $self->{level};
34             }
35              
36             sub Log {
37 36     36 0 721 my ($self, $level, $message) = @_;
38 36 100 100     112 return unless defined $level && defined $message;
39 32 100       80 return unless $level <= $self->{level};
40 27   50     73 my $level_name = $LEVEL_NAMES{$level} || 'UNKNOWN';
41 27         81 my ($sec, $usec) = gettimeofday;
42 27         961 my $timestamp = strftime("[%Y-%m-%d %H:%M:%S", localtime($sec)) . sprintf(".%03d]", $usec / 1000);
43 27         63 my $log_line = sprintf("%s %s %s\n", $timestamp, $level_name, $message);
44 27   66     117 my $fh = $self->{fh} || *STDERR;
45 27 100       31 print {$fh} $log_line or Die "Failed to write to log: $!";
  27         259  
46             }
47              
48             sub LogFormat {
49 6     6 0 2392 my ($self, $level, $format, @args) = @_;
50 6 50 33     49 return unless defined $level && defined $format;
51 6 50       11 return unless $level <= $self->{level};
52 6         34 $self->Log($level, sprintf($format, @args));
53             }
54              
55             sub LogFile {
56 6     6 0 1136 my ($self, $path) = @_;
57 6 100       17 if (defined $path) {
58 4 50 33     20 if ($self->{fh} && $self->{fh} ne *STDERR) {
59 0 0       0 close $self->{fh} or Die "Failed to close log file: $!";
60             }
61 4 100       304 open my $fh, '>>', $path or Die "Failed to open log file '$path': $!";
62 4         646 $self->{fh} = $fh;
63             } else {
64 2 50 33     21 if ($self->{fh} && $self->{fh} ne *STDERR) {
65 2 50       146 close $self->{fh} or Die "Failed to close log file: $!";
66             }
67 2         19 $self->{fh} = undef;
68             }
69 6 100       28 return $self->{fh} ? 1 : 0;
70             }
71              
72             sub LogDie {
73 4     4 0 3181 my ($self, $message) = @_;
74 4   100     17 $message //= 'Died';
75 4         13 $self->Log(1, $message);
76 4         16 Die $message;
77             }
78              
79             sub LogWarn {
80 4     4 0 2266 my ($self, $message) = @_;
81 4 50       25 return unless defined $message;
82 4         11 $self->Log(2, $message);
83             }
84              
85             sub LogInfo {
86 6     6 0 2305 my ($self, $message) = @_;
87 6 50       24 return unless defined $message;
88 6         18 $self->Log(3, $message);
89             }
90              
91             sub LogDebug {
92 6     6 0 1185 my ($self, $message) = @_;
93 6 50       17 return unless defined $message;
94 6         13 $self->Log(5, $message);
95             }
96              
97             sub LogErr {
98 4     4 0 13 my ($self, $message) = @_;
99 4 50       8 return unless defined $message;
100 4         12 $self->Log(1, $message);
101             }
102              
103             1;