From: Tyler Riddle Date: Sat, 10 Nov 2012 00:19:44 +0000 (-0800) Subject: OBJECT_REMOTE_LOG_SELECTIONS can turn logging classes on and off X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=74937354bfe5e4b492967e22d96521ebcb5b9a15;p=scpubgit%2FObject-Remote.git OBJECT_REMOTE_LOG_SELECTIONS can turn logging classes on and off --- diff --git a/lib/Object/Remote/Logging.pm b/lib/Object/Remote/Logging.pm index 49d43f5..c137b3e 100644 --- a/lib/Object/Remote/Logging.pm +++ b/lib/Object/Remote/Logging.pm @@ -78,6 +78,26 @@ sub before_import { } } +sub _parse_selections { + my ($selections_string) = @_; + my %log_ok; + + #example string: + #" * -Object::Remote::Logging Foo::Bar::Baz " + foreach(split(/\s+/, $selections_string)) { + next if $_ eq ''; + if ($_ eq '*') { + $log_ok{$_} = 1; + } elsif (s/^-//) { + $log_ok{$_} = 0; + } else { + $log_ok{$_} = 1; + } + } + + return %log_ok; +} + #this is invoked on all nodes sub init_logging { my $level = $ENV{OBJECT_REMOTE_LOG_LEVEL}; @@ -85,16 +105,18 @@ sub init_logging { my $selections = $ENV{OBJECT_REMOTE_LOG_SELECTIONS}; my %controller_should_log; - eval { + #TODO how can a third party module perform an action when a new + #interpreter is built on a remote node with out requiring support + #for that third party module baked into object::remote? + eval { require Log::Any::Adapter; - require Object::Remote::Logging::LogAnyInjector; Log::Any::Adapter->set('+Object::Remote::Logging::LogAnyInjector'); }; return unless defined $level; $format = "[%l %r] %s" unless defined $format; $selections = __PACKAGE__ unless defined $selections; - %controller_should_log = map { $_ => 1 } split(' ', $selections); + %controller_should_log = _parse_selections($selections); my $logger = Object::Remote::Logging::Logger->new( min_level => lc($level), format => $format, @@ -103,7 +125,11 @@ sub init_logging { router()->connect(sub { my $controller = $_[1]->{controller}; - return unless $controller_should_log{'*'} || $controller_should_log{$controller}; + my $will_log = $controller_should_log{$controller}; + + $will_log = $controller_should_log{'*'} unless defined $will_log; + + return unless $will_log; #skip things from remote hosts because they log to STDERR #when OBJECT_REMOTE_LOG_LEVEL is in effect return if $_[1]->{remote}->{connection_id}; @@ -138,6 +164,7 @@ Object::Remote::Logging - Logging subsystem for Object::Remote $ENV{OBJECT_REMOTE_LOG_LEVEL} = 'trace'; #or other level name $ENV{OBJECT_REMOTE_LOG_FORMAT} = '%l %t: %p::%m %s'; #and more $ENV{OBJECT_REMOTE_LOG_SELECTIONS} = 'Object::Remote::Logging Some::Other::Subclass'; + $ENV{OBJECT_REMOTE_LOG_SELECTIONS} = '* -Object::Remote::Logging'; $ENV{OBJECT_REMOTE_LOG_FORWARDING} = 0 || 1; #default 0 log_info { 'Trace log event' }; @@ -180,8 +207,11 @@ automatically be enabled via OBJECT_REMOTE_LOG_LEVEL and formated with OBJECT_REMOTE_LOG_FORMAT but those additional log messages are not sent to STDERR. By setting the OBJECT_REMOTE_LOG_SELECTIONS environment variable to a list of class names seperated by spaces then logs generated by packages that use those classes -will be sent to STDERR. This is also a configuration item that is forwarded to the -remote interpreters so all logging is consistent. +will be sent to STDERR. If the asterisk character (*) is used in the place of a class +name then all class names will be selected by default instead of ignored. An individual +class name can be turned off by prefixing the name with a hypen character (-). This is +also a configuration item that is forwarded to the remote interpreters so all logging +is consistent. Regardless of OBJECT_REMOTE_LOG_LEVEL the logging system is still active and loggers can access the stream of log messages to format and output them. Internally diff --git a/lib/Object/Remote/Logging/LogAnyInjector.pm b/lib/Object/Remote/Logging/LogAnyInjector.pm index a8cf177..77d75b7 100644 --- a/lib/Object/Remote/Logging/LogAnyInjector.pm +++ b/lib/Object/Remote/Logging/LogAnyInjector.pm @@ -23,7 +23,7 @@ sub AUTOLOAD { our %LEVEL_NAME_MAP; #just a proof of concept - support for the is_ methods can - #be done but requires more modifications to the router + #be done but requires modifications to the router return 1 if $log_level =~ m/^is_/; #skip DESTROY and friends return if $log_level =~ m/^[A-Z]+$/;