X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2FObject-Remote.git;a=blobdiff_plain;f=lib%2FObject%2FRemote%2FLogging.pm;h=d8bfdba721b2527c399b96c4254df2d759b140f4;hp=1839f22e25298625563276f7f37c811600ed2440;hb=eb49c7df7a88ac9114188e9eeb1480205bea97ee;hpb=5e2b222948b50fe1bff9e0cc8285fd6e2c930d1c diff --git a/lib/Object/Remote/Logging.pm b/lib/Object/Remote/Logging.pm index 1839f22..d8bfdba 100644 --- a/lib/Object/Remote/Logging.pm +++ b/lib/Object/Remote/Logging.pm @@ -1,15 +1,74 @@ package Object::Remote::Logging; -use strictures 1; +use Moo; +use Scalar::Util qw(blessed); +use Object::Remote::Logging::Logger; +use Exporter::Declare; -use Log::Contextual::Routed qw( :log ); -use base qw(Log::Contextual::Routed); +extends 'Log::Contextual'; -sub get_parent_router { $_[0]->SUPER::get_parent_router } +exports(qw( router arg_levels )); -use Data::Dumper; +sub router { + our $Router_Instance ||= do { + require Object::Remote::Logging::Router; + Object::Remote::Logging::Router->new; + } +} -sub init_node { my $n = `hostname`; chomp($n); $_[0]->add_child_router("[node $n]", __PACKAGE__->get_root_router) } +#log level descriptions +#info - standard log level - normal program output for the end user +#warn - output for program that is executing quietly +#error - output for program that is running more quietly +#fatal - it is not possible to continue execution; this level is as quiet as is possible +#verbose - output for program executing verbosely (-v) +#debug - output for program running more verbosely (-v -v) +#trace - output for program running extremely verbosely (-v -v -v) +sub arg_levels { + #the order of the log levels is significant with the + #most verbose level being first in the list and the + #most quiet as the last item + return [qw( trace debug verbose info warn error fatal )]; +} + +#this is invoked on all nodes +sub init_logging { + my $level = $ENV{OBJECT_REMOTE_LOG_LEVEL}; + my $format = $ENV{OBJECT_REMOTE_LOG_FORMAT}; + #TODO allow the selections value to be * so it selects everything + my $selections = $ENV{OBJECT_REMOTE_LOG_SELECTIONS}; + my %controller_should_log; + + return unless defined $level; + $format = "[%l %r] %s" unless defined $format; + $selections = __PACKAGE__ unless defined $selections; + %controller_should_log = map { $_ => 1 } split(' ', $selections); + + my $logger = Object::Remote::Logging::Logger->new( + min_level => lc($level), format => $format, + level_names => Object::Remote::Logging::arg_levels(), + ); + + #TODO check on speed of string compare against a hash with a single key + router()->connect(sub { + my $controller = $_[1]->{controller}; +# warn $controller; + return unless $controller_should_log{$controller}; + #skip things from remote hosts because they log to STDERR + #when OBJECT_REMOTE_LOG_LEVEL is in effect + return if $_[1]->{remote}->{connection_id}; + $logger + }); +} + +#this is invoked by the controlling node +#on the remote nodes +sub init_logging_forwarding { + my ($self, %controller_info) = @_; + + router()->_remote_metadata({ connection_id => $controller_info{connection_id} }); + router()->_forward_destination($controller_info{router}); +} 1;