File Coverage

blib/lib/SignalWire/Agents/Logging.pm
Criterion Covered Total %
statement 21 31 67.7
branch 3 4 75.0
condition 5 9 55.5
subroutine 7 11 63.6
pod 0 5 0.0
total 36 60 60.0


line stmt bran cond sub pod time code
1             package SignalWire::Agents::Logging;
2 4     4   29 use strict;
  4         10  
  4         248  
3 4     4   27 use warnings;
  4         7  
  4         268  
4 4     4   24 use Moo;
  4         7  
  4         29  
5              
6             # Log levels in ascending severity
7             my %LEVELS = (
8             debug => 0,
9             info => 1,
10             warn => 2,
11             error => 3,
12             );
13              
14             has 'name' => (
15             is => 'ro',
16             default => sub { 'signalwire' },
17             );
18              
19             has 'level' => (
20             is => 'rw',
21             default => sub {
22             my $env = $ENV{SIGNALWIRE_LOG_LEVEL} // 'info';
23             return lc($env);
24             },
25             );
26              
27             has 'suppressed' => (
28             is => 'rw',
29             default => sub {
30             my $mode = $ENV{SIGNALWIRE_LOG_MODE} // '';
31             return lc($mode) eq 'off' ? 1 : 0;
32             },
33             );
34              
35             sub _should_log {
36 10     10   4196 my ($self, $msg_level) = @_;
37 10 100       49 return 0 if $self->suppressed;
38 9   50     65 my $current = $LEVELS{ $self->level } // 1;
39 9   50     27 my $target = $LEVELS{ $msg_level } // 1;
40 9         51 return $target >= $current;
41             }
42              
43             sub _log {
44 4     4   10 my ($self, $level, @msgs) = @_;
45 4 50       10 return unless $self->_should_log($level);
46 0         0 my $tag = uc($level);
47 0         0 my $name = $self->name;
48 0         0 my $msg = join(' ', @msgs);
49 0         0 my $ts = _timestamp();
50 0         0 print STDERR "[$ts] [$tag] [$name] $msg\n";
51             }
52              
53 4     4 0 15 sub debug { shift->_log('debug', @_) }
54 0     0 0 0 sub info { shift->_log('info', @_) }
55 0     0 0 0 sub warn { shift->_log('warn', @_) }
56 0     0 0 0 sub error { shift->_log('error', @_) }
57              
58             sub _timestamp {
59 0     0   0 my @t = localtime;
60 0         0 return sprintf('%04d-%02d-%02d %02d:%02d:%02d',
61             $t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);
62             }
63              
64             # Singleton-ish factory
65             my %loggers;
66              
67             sub get_logger {
68 9     9 0 173970 my ($class, $name) = @_;
69 9   50     66 $name //= 'signalwire';
70 9   66     95 $loggers{$name} //= SignalWire::Agents::Logging->new(name => $name);
71 9         149 return $loggers{$name};
72             }
73              
74             1;