/
Logger.pm
96 lines (80 loc) · 1.91 KB
/
Logger.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package Logger;
use strict;
use warnings;
use utf8;
use Attribute::Constant;
our $LEVEL_ERROR :Constant(1); # error
our $LEVEL_WARNING :Constant(2); # warning
our $LEVEL_INFO :Constant(3); # information for user
our $LEVEL_VERBOSE :Constant(4); # verbose information
our $LEVEL_DEBUG :Constant(5); # heart beat
sub parse_debug_level {
my($str)=@_;
if($str){
return $LEVEL_ERROR if $str =~ /err/i;
return $LEVEL_WARNING if $str =~ /warn/i;
return $LEVEL_INFO if $str =~ /info/i;
return $LEVEL_VERBOSE if $str =~ /verb/i;
return $LEVEL_DEBUG if $str =~ /debug/i;
}
return undef;
}
sub string_debug_level {
my($lv) = @_;
if($lv){
return 'error' if $lv == $LEVEL_ERROR;
return 'warning' if $lv == $LEVEL_WARNING;
return 'info' if $lv == $LEVEL_INFO;
return 'verbose' if $lv == $LEVEL_VERBOSE;
return 'debug' if $lv == $LEVEL_DEBUG;
}
return '?';
}
sub new {
my $class = shift;
return bless {
debug_level => $LEVEL_DEBUG,
prefix => '',
@_,
},$class;
}
sub debug_level{
my $self = shift;
my $v = @_ ? $_[0] : undef;
if($v){
if( $v =~ /\A\d+\z/ and $LEVEL_ERROR <= $v and $v <= $LEVEL_DEBUG ){
$self->{debug_level} = 0+ $v;
}else{
$v = parse_debug_level($v);
$v and $self->{debug_level} = $v;
}
}
return $self->{debug_level};
}
sub prefix{
my $self = shift;
my $v = @_ ? $_[0] : undef;
defined($v) and $self->{prefix} = $v;
return $self->{prefix};
}
sub clone{
my $self = shift;
return bless { %$self }, ref $self;
}
sub log{
my($self,$lv,@args)=@_;
return if $lv > $self->{debug_level};
my @lt = localtime;
$lt[5]+=1900;
$lt[4]+=1;
printf STDERR "%d:%02d:%02d_%d:%02d:%02d %s",(reverse @lt[0..5]),$self->{prefix};
printf STDERR @args;
print STDERR "\n";
}
sub e{ shift->log( $LEVEL_ERROR, @_ ) }
sub w{ shift->log( $LEVEL_WARNING, @_ ) }
sub i{ shift->log( $LEVEL_INFO, @_ ) }
sub v{ shift->log( $LEVEL_VERBOSE, @_ ) }
sub d{ shift->log( $LEVEL_DEBUG, @_ ) }
1;
__END__