export router function in ::Logging; add time of log event to metadata and render...
[scpubgit/Object-Remote.git] / lib / Object / Remote / Logging / Logger.pm
CommitLineData
4e446335 1package Object::Remote::Logging::Logger;
2
3use Moo;
4use Scalar::Util qw(weaken);
5
6has level_names => ( is => 'ro', required => 1 );
7has min_level => ( is => 'ro', required => 1 );
8has max_level => ( is => 'ro' );
9has _level_active => ( is => 'lazy' );
10
11sub BUILD {
c0b2df05 12 my ($self) = @_;
13 our $METHODS_INSTALLED;
14 $self->_install_methods unless $METHODS_INSTALLED;
4e446335 15}
16
17sub _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
39sub _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
52sub _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
59sub _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
85sub _output {
c0b2df05 86 my ($self, $content) = @_;
87 print STDERR $content;
4e446335 88}
89
90
911;
92