MT#7705 change Panel.pm to use ngcp-panel/logging.conf, reworked Utils/Message.pm logging

agranig/webphone
Kirill Solomko 11 years ago
parent 213355944c
commit 18e07b2950

@ -44,7 +44,7 @@ for my $path(qw#/etc/ngcp-panel/ngcp_panel.conf etc/ngcp_panel.conf ngcp_panel.c
}
$panel_config //= 'ngcp_panel.conf';
my $logger_config = '/etc/ngcp-ossbss/logging.conf';
my $logger_config = '/etc/ngcp-panel/logging.conf';
$logger_config = $panel_config unless(-f $logger_config);
__PACKAGE__->config(

@ -2,54 +2,135 @@ package NGCP::Panel::Utils::Message;
use Catalyst;
use Sipwise::Base;
method error ($self: Catalyst :$c, Str :$desc, Str :$log?, :$error?) {
# we explicitly declare the invocant to skip the validation for Object
# because we want a class method instead of an object method
if (defined $log) {
$c->log->error($log);
$c->flash(messages => [{type => 'error', text => $desc}]);
return;
use Data::Dumper;
use DateTime qw();
use DateTime::Format::RFC3339 qw();
use Time::HiRes qw();
method get_log_params ($self: Catalyst :$c) {
# get log_tx_id, caller method, remote user, formatted passed parameters
my $log_tx = DateTime->from_epoch(epoch => Time::HiRes::time);
my $log_tx_id = sprintf '%X', $log_tx->strftime('%s%N');
my $caller = (caller 2)[3];
$caller !~ /::/ and $caller = (caller 3)[3];
my $called = '';
if ($caller) {
my @caller = split('::', $caller);
$#caller >= 3 and $called = join('::', @caller[-3...-1]);
}
unless (defined $error) {
$c->log->error("$desc (no detailed information available)");
$c->flash(messages => [{type => 'error', text => "$desc"}]);
return;
my $r_user = '';
if ($c->user->roles eq 'admin' || $c->user->roles eq 'reseller') {
$r_user = $c->user->login;
} else {
$r_user = $c->user->webusername . '@' . $c->user->domain->domain;
}
if (my ($host) = $error =~ /problem connecting to (\S+, port [0-9]+)/ ) {
$c->log->error("$desc ($error)");
$c->flash(messages => [{type => 'error', text => "$desc (A service could not be reached, $host)"}]);
return;
my $data = Data::Dumper->new([$c->request->parameters])
->Terse(1)
->Dump;
$data =~ s/\n//g;
$data =~ s/\s+/ /g;
unless ($c->config->{logging}->{clear_passwords}) {
}
if ( ref($error) eq "ARRAY" && @$error >= 2 && $error->[1] eq "showdetails" ) {
$c->log->error("$desc (@$error[0])");
$c->flash(messages => [{type => 'error', text => "$desc (@$error[0])"}]);
return;
}
return {
tx_id => $log_tx_id,
called => $called,
r_user => $r_user,
data => $data,
};
}
unless ( $error->isa('DBIx::Class::Exception') ) {
$c->log->error("$desc ($error)");
$c->flash(messages => [{type => 'error', text => $desc}]);
return;
}
method error ($self: Catalyst :$c, Str :$desc, Str :$log?, :$error?) {
# we explicitly declare the invocant to skip the validation for Object
# because we want a class method instead of an object method
if ( my ($dup) = $error =~ /(Duplicate entry \S*)/ ) {
$c->log->error("$desc ($error)");
$c->flash(messages => [{type => 'error', text => "$desc ($dup)"}]);
return;
my $log_params = $self->get_log_params(c => $c);
my $log_msg = '';
my $usr_type = 'error';
my $usr_text = $desc;
given (1) {
when (defined $log)
{
$log_msg = $log
}
when (not defined $error)
{
$log_msg = $desc;
}
when (my ($host) = $error =~ /problem connecting to (\S+, port [0-9]+)/ )
{
$log_msg = "$desc ($error)";
$usr_text = "$desc (A service could not be reached, $host)";
}
when (ref($error) eq "ARRAY" && @$error >= 2 && $error->[1] eq "showdetails" )
{
$log_msg = "$desc (@$error[0])";
$usr_text = "$desc (@$error[0])";
}
when (not $error->isa('DBIx::Class::Exception') )
{
$log_msg = "$desc ($error)";
$usr_text = $desc;
}
when (my ($dup) = $error =~ /(Duplicate entry \S*)/ )
{
$log_msg = "$desc ($error)";
$usr_text = "$desc ($dup)";
}
when (my ($excerpt) = $error =~ /(Column \S+ cannot be null)/ ) {
$log_msg = "$desc ($error)";
$usr_text = "$desc ($excerpt)";
}
default {
$log_msg = "$desc ($error)";
}
}
$c->log->error(
sprintf <<EOF, @{$log_params}{qw(called tx_id r_user data)});
CALLED=%s TX=%s USER=%s DATA=%s MSG=$log_msg
EOF
$c->flash(messages => [{ type => $usr_type,
text => sprintf '%s [%s]',
$usr_text,
$log_params->{tx_id},
}]);
return;
}
method info ($self: Catalyst :$c, Str :$desc, Str :$log?) {
# we explicitly declare the invocant to skip the validation for Object
# because we want a class method instead of an object method
if ( my ($excerpt) = $error =~ /(Column \S+ cannot be null)/ ) {
$c->log->error("$desc ($error)");
$c->flash(messages => [{type => 'error', text => "$desc ($excerpt)"}]);
return;
my $log_params = $self->get_log_params(c => $c);
my $log_msg = '';
my $usr_type = 'info';
my $usr_text = $desc;
given (1) {
when (defined $log)
{
$log_msg = $log
}
default
{
$log_msg = $desc;
}
}
$c->log->error("$desc ($error)");
$c->flash(messages => [{type => 'error', text => $desc}]);
$c->log->info(
sprintf <<EOF, @{$log_params}{qw(called tx_id r_user data)});
CALLED=%s TX=%s USER=%s DATA=%s MSG=$log_msg
EOF
$c->flash(messages => [{ type => $usr_type, text => $usr_text }]);
return;
}
@ -69,6 +150,12 @@ Parse messages for log and Web display.
=head2 Functions
=head3 C<get_log_params>
Params: c (required)
Returns a hash ref with basic logging parameters that are used in "error", "info".
=head3 C<error>
Params: c (required), desc (required), error, log
@ -76,6 +163,12 @@ Params: c (required), desc (required), error, log
Parse Exceptions (mainly DBIx::Class::Exceptions) and show the relevant
bits on the panel. Also log everything to the logger.
=head3 C<info>
Params: c (required), desc (required), log
Shows the info message on the panel. Also logs everything to the logger.
=head1 AUTHOR
=head1 LICENSE

Loading…
Cancel
Save