1 package Object::Remote::Logging;
4 use Scalar::Util qw(blessed);
5 use Object::Remote::Logging::Logger;
8 extends 'Log::Contextual';
10 exports(qw( router arg_levels ));
13 our $Router_Instance ||= do {
14 require Object::Remote::Logging::Router;
15 Object::Remote::Logging::Router->new;
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)
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 )];
34 #this is invoked on all nodes
36 my $level = $ENV{OBJECT_REMOTE_LOG_LEVEL};
37 my $format = $ENV{OBJECT_REMOTE_LOG_FORMAT};
38 #TODO allow the selections value to be * so it selects everything
39 my $selections = $ENV{OBJECT_REMOTE_LOG_SELECTIONS};
40 my %controller_should_log;
42 return unless defined $level;
43 $format = "[%l %r] %s" unless defined $format;
44 $selections = __PACKAGE__ unless defined $selections;
45 %controller_should_log = map { $_ => 1 } split(' ', $selections);
47 my $logger = Object::Remote::Logging::Logger->new(
48 min_level => lc($level), format => $format,
49 level_names => Object::Remote::Logging::arg_levels(),
52 router()->connect(sub {
53 my $controller = $_[1]->{controller};
54 return unless $controller_should_log{'*'} || $controller_should_log{$controller};
55 #skip things from remote hosts because they log to STDERR
56 #when OBJECT_REMOTE_LOG_LEVEL is in effect
57 return if $_[1]->{remote}->{connection_id};
62 #this is invoked by the controlling node
64 sub init_logging_forwarding {
65 my ($self, %controller_info) = @_;
67 router()->_remote_metadata({ connection_id => $controller_info{connection_id} });
68 router()->_forward_destination($controller_info{router}) if $ENV{OBJECT_REMOTE_LOG_FORWARDING};