When running methods for clients, send plain warnings to "real" logs collab/senator/warnings-to-regular-logs
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 14 Nov 2012 19:50:46 +0000 (14:50 -0500)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 14 Nov 2012 20:01:29 +0000 (15:01 -0500)
Code inside an OpenSRF application method may use Perl libraries that warn
and carp like most Perl code is wont to do.  Instead of letting
those message go to STDERR where they can be easily missed (and take up
lots of disk space on application boxes), why not catch them and
redirect them to our "real" logs using OpenSRF::Utils::Logger ?

Deployment of this change would probably have the side effect of bringing
to light bugs in applications (Evergreen) that will suddenly seem very
noisy.

Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
src/perl/lib/OpenSRF/Application.pm

index 9283b7f..b4e2621 100644 (file)
@@ -581,8 +581,16 @@ sub run {
        if (!$self->{remote}) {
                my $code = \&{$self->{package} . '::' . $self->{method}};
                my $err = undef;
+               my $warnhandler;
 
                try {
+                       $warnhandler = $SIG{__WARN__};
+                       $SIG{__WARN__} = sub {
+                               (my $msg = shift) =~ s/\n$//;
+                               $log->warn($self->{api_name} . ": $msg");
+                               return 1; # prevents warning going out to stderr
+                       };
+
                        $resp = $code->($self, $req, @params);
 
                } catch Error with {
@@ -591,6 +599,8 @@ sub run {
                        if( ref($self) eq 'HASH') {
                                $log->error("Sub $$self{package}::$$self{method} DIED!!!\n\t$err\n", ERROR);
                        }
+               } finally {
+                       $SIG{__WARN__} = $warnhandler;
                };
 
                if($err) {