Commit | Line | Data |
4e446335 |
1 | package Object::Remote::Logging::Logger; |
2 | |
3 | use Moo; |
4 | use Scalar::Util qw(weaken); |
5 | |
6 | has level_names => ( is => 'ro', required => 1 ); |
7 | has min_level => ( is => 'ro', required => 1 ); |
8 | has max_level => ( is => 'ro' ); |
9 | has _level_active => ( is => 'lazy' ); |
10 | |
11 | sub BUILD { |
c0b2df05 |
12 | my ($self) = @_; |
13 | our $METHODS_INSTALLED; |
14 | $self->_install_methods unless $METHODS_INSTALLED; |
4e446335 |
15 | } |
16 | |
17 | sub _build__level_active { |
c0b2df05 |
18 | my ($self) = @_; |
19 | my $should_log = 0; |
20 | my $min_level = $self->min_level; |
21 | my $max_level = $self->max_level; |
22 | my %active; |
4e446335 |
23 | |
c0b2df05 |
24 | foreach my $level (@{$self->level_names}) { |
25 | if($level eq $min_level) { |
26 | $should_log = 1; |
27 | } |
28 | |
29 | $active{$level} = $should_log; |
4e446335 |
30 | |
c0b2df05 |
31 | if (defined $max_level && $level eq $max_level) { |
32 | $should_log = 0; |
4e446335 |
33 | } |
c0b2df05 |
34 | } |
35 | |
36 | return \%active; |
4e446335 |
37 | } |
38 | |
39 | sub _install_methods { |
c0b2df05 |
40 | my ($self) = @_; |
41 | my $should_log = 0; |
42 | our $METHODS_INSTALLED = 1; |
4e446335 |
43 | |
c0b2df05 |
44 | no strict 'refs'; |
4e446335 |
45 | |
c0b2df05 |
46 | foreach my $level (@{$self->level_names}) { |
47 | *{"is_$level"} = sub { shift(@_)->_level_active->{$level} }; |
48 | *{$level} = sub { shift(@_)->_log($level, @_) }; |
49 | } |
4e446335 |
50 | } |
51 | |
52 | sub _log { |
c0b2df05 |
53 | my ($self, $level, $content, $metadata_in) = @_; |
c0b2df05 |
54 | my %metadata = %$metadata_in; |
55 | my $rendered = $self->_render($level, \%metadata, @$content); |
56 | $self->_output($rendered); |
4e446335 |
57 | } |
58 | |
59 | sub _render { |
c0b2df05 |
60 | my ($self, $level, $metadata, @content) = @_; |
c0b2df05 |
61 | my $remote_info = $metadata->{object_remote}; |
f4a85080 |
62 | my $when = $metadata->{timestamp}; |
63 | my $rendered; |
c0b2df05 |
64 | |
f4a85080 |
65 | if (defined($when)) { |
66 | $when = localtime($when); |
67 | } else { |
68 | $when = 'no time data'; |
69 | } |
70 | |
c0b2df05 |
71 | if ($remote_info) { |
f4a85080 |
72 | $rendered .= "[$level connection #$remote_info->{connection_id}] [$when] "; |
c0b2df05 |
73 | } else { |
f4a85080 |
74 | $rendered .= "[$level local] [$when] "; |
c0b2df05 |
75 | } |
f4a85080 |
76 | |
4e446335 |
77 | |
c0b2df05 |
78 | $rendered .= join('', @content); |
f4a85080 |
79 | chomp($rendered); |
80 | $rendered =~ s/\n/\n /g; |
81 | $rendered .= "\n"; |
c0b2df05 |
82 | return $rendered; |
4e446335 |
83 | } |
84 | |
85 | sub _output { |
c0b2df05 |
86 | my ($self, $content) = @_; |
87 | print STDERR $content; |
4e446335 |
88 | } |
89 | |
90 | |
91 | 1; |
92 | |