export router function in ::Logging; add time of log event to metadata and render...
[scpubgit/Object-Remote.git] / lib / Object / Remote / Logging / Logger.pm
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 {
12   my ($self) = @_;
13   our $METHODS_INSTALLED; 
14   $self->_install_methods unless $METHODS_INSTALLED;
15 }
16
17 sub _build__level_active {
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;
23     
24   foreach my $level (@{$self->level_names}) {
25     if($level eq $min_level) {
26       $should_log = 1; 
27     }
28
29     $active{$level} = $should_log;
30         
31     if (defined $max_level && $level eq $max_level) {
32       $should_log = 0;
33     }
34   }
35
36   return \%active;
37 }
38
39 sub _install_methods {
40   my ($self) = @_;
41   my $should_log = 0;
42   our $METHODS_INSTALLED = 1;
43     
44   no strict 'refs';
45     
46   foreach my $level (@{$self->level_names}) {
47     *{"is_$level"} = sub { shift(@_)->_level_active->{$level} };
48     *{$level} = sub { shift(@_)->_log($level, @_) };
49   }
50 }
51
52 sub _log {
53   my ($self, $level, $content, $metadata_in) = @_;
54   my %metadata = %$metadata_in;
55   my $rendered = $self->_render($level, \%metadata, @$content);
56   $self->_output($rendered);
57 }
58
59 sub _render {
60   my ($self, $level, $metadata, @content) = @_;
61   my $remote_info = $metadata->{object_remote};
62   my $when = $metadata->{timestamp};
63   my $rendered;
64
65   if (defined($when)) {
66     $when = localtime($when);
67   } else {
68       $when = 'no time data';
69   }
70   
71   if ($remote_info) {
72     $rendered .= "[$level connection #$remote_info->{connection_id}] [$when] ";
73   } else {
74     $rendered .= "[$level local] [$when] ";
75   }
76   
77     
78   $rendered .= join('', @content);
79   chomp($rendered);
80   $rendered =~ s/\n/\n /g;
81   $rendered .= "\n";
82   return $rendered;
83 }
84
85 sub _output {
86   my ($self, $content) = @_;
87   print STDERR $content;
88 }
89
90
91 1;
92