Bug 25464: Add ability to specify client IP and SIP account used in SIP2 logging

Bug 15253 originally had the ability to specify the incoming IP address used for
a given log statement via SIP, as well as the SIP2 account that was in use at the time.
This data is very helpful for debugging purposes, and should be brought back.

Test Plan:
1) Apply this patch
2) Update you SIP ConversionPattern to "[%d] [%p] %X{accountid}@%X{peeraddr}: %m %l %n"
3) Restart SIP
4) Use the SIP cli tester to make some SIP requests
5) View the SIP2 log, note the account id and client ip address show in the log!

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Kyle M Hall 2020-05-12 07:11:12 -04:00 committed by Jonathan Druart
parent cb2eae80d9
commit 006c70f4f2
6 changed files with 66 additions and 5 deletions

View File

@ -106,6 +106,9 @@ sub process_request {
$self->{account} = undef; # Clear out the account from the last request, it may be different
$self->{logger} = set_logger( Koha::Logger->get( { interface => 'sip' } ) );
# Flush previous MDCs to prevent accidentally leaking incorrect MDC-entries
Koha::Logger->clear_mdc();
my $sockname = getsockname(STDIN);
# Check if socket connection is IPv6 before resolving address
@ -180,6 +183,10 @@ sub raw_transport {
)
);
# Set MDCs after properly authenticating
Koha::Logger->put_mdc( "accountid", $self->{account}->{id} );
Koha::Logger->put_mdc( "peeraddr", $self->{server}->{peeraddr} );
siplog("LOG_DEBUG", "raw_transport: uname/inst: '%s/%s'",
$self->{account}->{id},
$self->{account}->{institution});

View File

@ -70,6 +70,49 @@ sub get {
return $self;
}
=head2 put_mdc
my $foo = $logger->put_mdc('foo', $foo );
put_mdc sets global thread specific data that can be access later when generating log lines
via the "%X{key}" placeholder in Log::Log4perl::Layout::PatternLayouts.
=cut
sub put_mdc {
my ( $self, $key, $value ) = @_;
Log::Log4perl::MDC->put( $key, $value );
}
=head2 get_mdc
my $foo = $logger->get_mdc('foo');
Retrieves the stored mdc value from the stored map.
=cut
sub get_mdc {
my ( $self, $key ) = @_;
return Log::Log4perl::MDC->get( $key );
}
=head2 clear_mdc
$logger->clear_mdc();
Removes *all* stored key/value pairs from the MDC map.
=cut
sub clear_mdc {
my ( $self, $key ) = @_;
return Log::Log4perl::MDC->remove( $key );
}
=head1 INTERNALS
=head2 AUTOLOAD

View File

@ -182,7 +182,7 @@ log4perl.appender.SIP=Log::Log4perl::Appender::File
log4perl.appender.SIP.filename=/var/log/koha/$site/sip.log
log4perl.appender.SIP.mode=append
log4perl.appender.SIP.layout=PatternLayout
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %m %l%n
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %X{accountid}@%X{peeraddr}: %m %l%n
log4perl.appender.SIP.utf8=1
EOF

View File

@ -35,7 +35,7 @@ log4perl.appender.SIP=Log::Log4perl::Appender::File
log4perl.appender.SIP.filename=__LOG_DIR__/sip.log
log4perl.appender.SIP.mode=append
log4perl.appender.SIP.layout=PatternLayout
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %m %l%n
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %X{accountid}@%X{peeraddr}: %m %l%n
log4perl.appender.SIP.utf8=1

View File

@ -35,7 +35,7 @@ log4perl.appender.SIP=Log::Log4perl::Appender::File
log4perl.appender.SIP.filename=__LOG_DIR__/sip.log
log4perl.appender.SIP.mode=append
log4perl.appender.SIP.layout=PatternLayout
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %m %l%n
log4perl.appender.SIP.layout.ConversionPattern=[%d] [%P] [%p] %X{accountid}@%X{peeraddr}: %m %l%n
log4perl.appender.SIP.utf8=1
log4perl.logger.plack-opac = WARN, PLACKOPAC

View File

@ -26,7 +26,7 @@ use Test::More tests => 1;
use Test::Warn;
subtest 'Test01 -- Simple tests for Koha::Logger' => sub {
plan tests => 6;
plan tests => 10;
my $ret;
t::lib::Mocks::mock_config('log4perl_conf', undef);
@ -52,7 +52,7 @@ HERE
ok( $@, 'Logger did not init correctly without permission');
system("chmod 700 $log");
my $logger= Koha::Logger->get({ interface => 'intranet' });
my $logger = Koha::Logger->get( { interface => 'intranet' } );
is( exists $logger->{logger}, 1, 'Log4perl config found');
is( $logger->warn('Message 1'), 1, '->warn returned a value' );
warning_is { $ret = $logger->catastrophe }
@ -60,6 +60,17 @@ HERE
"Undefined method raises warning";
is( $ret, undef, "'catastrophe' method undefined");
Koha::Logger->put_mdc( 'foo', 'bar' );
is( Koha::Logger->get_mdc( 'foo' ), 'bar', "MDC value via put_mdc is correct" );
Koha::Logger->put_mdc( 'foo', undef );
is( Koha::Logger->get_mdc( 'foo' ), undef, "Updated MDC value to undefined via put_mdc is correct" );
Koha::Logger->put_mdc( 'foo', 'baz' );
is( Koha::Logger->get_mdc( 'foo' ), 'baz', "Updated MDC value via put_mdc is correct" );
Koha::Logger->clear_mdc();
is( Koha::Logger->get_mdc( 'foo' ), undef, "MDC value was cleared by clear_mdc" );
};
sub mytempfile {