new env vars: OBJECT_REMOTE_PERL_PATH and OBJECT_REMOTE_LOG_FORMAT
[scpubgit/Object-Remote.git] / lib / Object / Remote / Logging.pm
1 package Object::Remote::Logging;
2
3 use Moo;
4 use Scalar::Util qw(blessed);
5 use Object::Remote::Logging::Logger;
6 use Exporter::Declare;
7
8 extends 'Log::Contextual';
9
10 exports(qw( router ));
11
12 sub router {
13   our $Router_Instance ||= do {
14     require Object::Remote::Logging::Router;
15     Object::Remote::Logging::Router->new;
16   }
17 }
18
19 #log level descriptions
20 #info - standard log level - normal program output for the end user
21 #warn - output for program that is executing quietly
22 #error - output for program that is running more quietly
23 #fatal - it is not possible to continue execution; this level is as quiet as is possible
24 #verbose - output for program executing verbosely (-v)
25 #debug - output for program running more verbosely (-v -v)
26 #trace - output for program running extremely verbosely (-v -v -v)
27 sub arg_levels {
28   #the order of the log levels is significant with the
29   #most verbose level being first in the list and the
30   #most quiet as the last item
31   return [qw( trace debug verbose info warn error fatal )];
32 }
33
34 #this is invoked on all nodes
35 sub init_logging {
36   my $level = $ENV{OBJECT_REMOTE_LOG_LEVEL};
37   my $format = $ENV{OBJECT_REMOTE_LOG_FORMAT};
38   return unless defined $level;
39   $format = "[%l %r] %s" unless defined $format;
40   my $logger = Object::Remote::Logging::Logger->new(
41     min_level => lc($level), format => $format,
42     level_names => Object::Remote::Logging::arg_levels(),
43   );
44
45   #TODO check on speed of string compare against a hash with a single key
46   router()->connect(sub { 
47     return unless $_[1]->{controller} eq __PACKAGE__;
48     #skip things from remote hosts because they log to STDERR
49     #when OBJECT_REMOTE_LOG_LEVEL is in effect
50     return if $_[1]->{remote}->{connection_id};
51     $logger
52   });
53 }
54
55 #this is invoked by the controlling node
56 #on the remote nodes
57 sub init_logging_forwarding {
58   my ($self, %controller_info) = @_;
59   
60   router()->_remote_metadata({ connection_id => $controller_info{connection_id} });
61   router()->_forward_destination($controller_info{router});
62 }
63
64 1;
65