logger class supports printf style formats to control rendering
[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
454ec6a2 6has format => ( is => 'ro', required => 1, default => sub { '[%l %r] %s' } );
4e446335 7has level_names => ( is => 'ro', required => 1 );
8has min_level => ( is => 'ro', required => 1 );
9has max_level => ( is => 'ro' );
10has _level_active => ( is => 'lazy' );
11
12sub BUILD {
c0b2df05 13 my ($self) = @_;
14 our $METHODS_INSTALLED;
15 $self->_install_methods unless $METHODS_INSTALLED;
4e446335 16}
17
18sub _build__level_active {
c0b2df05 19 my ($self) = @_;
20 my $should_log = 0;
21 my $min_level = $self->min_level;
22 my $max_level = $self->max_level;
23 my %active;
4e446335 24
c0b2df05 25 foreach my $level (@{$self->level_names}) {
26 if($level eq $min_level) {
27 $should_log = 1;
28 }
29
30 $active{$level} = $should_log;
4e446335 31
c0b2df05 32 if (defined $max_level && $level eq $max_level) {
33 $should_log = 0;
4e446335 34 }
c0b2df05 35 }
36
37 return \%active;
4e446335 38}
39
40sub _install_methods {
c0b2df05 41 my ($self) = @_;
42 my $should_log = 0;
43 our $METHODS_INSTALLED = 1;
454ec6a2 44
c0b2df05 45 no strict 'refs';
454ec6a2 46
c0b2df05 47 foreach my $level (@{$self->level_names}) {
48 *{"is_$level"} = sub { shift(@_)->_level_active->{$level} };
49 *{$level} = sub { shift(@_)->_log($level, @_) };
50 }
4e446335 51}
52
53sub _log {
c0b2df05 54 my ($self, $level, $content, $metadata_in) = @_;
c0b2df05 55 my %metadata = %$metadata_in;
56 my $rendered = $self->_render($level, \%metadata, @$content);
57 $self->_output($rendered);
4e446335 58}
59
454ec6a2 60sub _create_format_lookup {
61 my ($self, $level, $metadata, $content) = @_;
62 return {
63 '%' => '%', t => $self->_render_time($metadata->{timestamp}),
64 r => $self->_render_remote($metadata->{object_remote}),
65 s => $self->_render_log(@$content), l => $level, p => $metadata->{package},
66
67 };
68}
69
70sub _get_format_var_value {
71 my ($self, $name, $data) = @_;
72 my $val = $data->{$name};
73 return $val if defined $val;
74 return '';
75}
76
77sub _render_time {
78 my ($self, $time) = @_;
79 return scalar(localtime($time));
80}
81
82sub _render_remote {
83 my ($self, $remote) = @_;
84 return 'local' if ! defined $remote || ! defined $remote->{connection_id};
85 return 'remote #' . $remote->{connection_id};
86}
87
88sub _render_log {
89 my ($self, @content) = @_;
90 return join('', @content);
91}
4e446335 92sub _render {
c0b2df05 93 my ($self, $level, $metadata, @content) = @_;
454ec6a2 94 my $var_table = $self->_create_format_lookup($level, $metadata, [@content]);
95 my $template = $self->format;
f4a85080 96
454ec6a2 97 $template =~ s/%([\w])/$self->_get_format_var_value($1, $var_table)/ge;
f4a85080 98
454ec6a2 99 chomp($template);
100 $template =~ s/\n/\n /g;
101 $template .= "\n";
102 return $template;
4e446335 103}
104
105sub _output {
c0b2df05 106 my ($self, $content) = @_;
107 print STDERR $content;
4e446335 108}
109
110
1111;
112