Handle multi-line log events.

This commit is contained in:
Daniel Nichter
2013-06-10 19:59:39 -07:00
parent 6e3ba2ce24
commit bee0c7a5f1
2 changed files with 41 additions and 17 deletions

View File

@@ -4922,9 +4922,18 @@ sub start_online_logging {
my $lines = read_stdin($read_timeout); my $lines = read_stdin($read_timeout);
last QUEUE unless $lines; last QUEUE unless $lines;
LINE: LINE:
foreach my $line ( @$lines ) { while ( defined(my $line = shift @$lines) ) {
my ($ts, $level, $msg) = $line =~ m/^([^,]+),([^,]+),(.+)/s; my ($ts, $level, $n_lines, $msg) = $line =~ m/^([^,]+),([^,]+),(.+)/s;
chomp $msg; if ( !$ts || !$level || !$n_lines || !$msg ) {
warn "Invalid log entry: $line\n";
next LINE;
}
if ( $n_lines > 1 ) {
$n_lines--; # first line
for ( 1..$n_lines ) {
$msg .= shift @$lines;
}
}
push @log_entries, Percona::WebAPI::Resource::LogEntry->new( push @log_entries, Percona::WebAPI::Resource::LogEntry->new(
pid => $self->pid, pid => $self->pid,
@@ -4950,7 +4959,7 @@ sub start_online_logging {
@log_entries = (); @log_entries = ();
} }
} # have log entries } # have log entries
} # QUEUE oktorun } # LINE
if ( scalar @log_entries ) { if ( scalar @log_entries ) {
my $ts = ts(time, 0); # 0=local time my $ts = ts(time, 0); # 0=local time
@@ -5031,14 +5040,18 @@ sub _log {
my $ts = ts(time, 1); # 1=UTC my $ts = ts(time, 1); # 1=UTC
my $level_number = level_number($level); my $level_number = level_number($level);
chomp($msg);
my $n_lines = 1;
$n_lines++ while $msg =~ m/\n/g;
if ( $self->online_logging ) { if ( $self->online_logging ) {
while ( defined(my $log_entry = shift @{$self->_buffer}) ) { while ( defined(my $log_entry = shift @{$self->_buffer}) ) {
$self->_queue_log_entry(@$log_entry); $self->_queue_log_entry(@$log_entry);
} }
$self->_queue_log_entry($ts, $level_number, $msg); $self->_queue_log_entry($ts, $level_number, $n_lines, $msg);
} }
else { else {
push @{$self->_buffer}, [$ts, $level_number, $msg]; push @{$self->_buffer}, [$ts, $level_number, $n_lines, $msg];
my $ts = ts(time, 0); # 0=local time my $ts = ts(time, 0); # 0=local time
if ( $level_number >= 3 ) { # warning if ( $level_number >= 3 ) { # warning
@@ -5054,8 +5067,7 @@ sub _log {
sub _queue_log_entry { sub _queue_log_entry {
my ($self, $ts, $log_level, $msg) = @_; my ($self, $ts, $log_level, $msg) = @_;
$msg .= "\n" unless $msg =~ m/\n\Z/; print "$ts,$log_level,$msg\n";
print "$ts,$log_level,$msg";
return; return;
} }

View File

@@ -130,10 +130,19 @@ sub start_online_logging {
my $lines = read_stdin($read_timeout); my $lines = read_stdin($read_timeout);
last QUEUE unless $lines; last QUEUE unless $lines;
LINE: LINE:
foreach my $line ( @$lines ) { while ( defined(my $line = shift @$lines) ) {
# $line = ts,level,message # $line = ts,level,n_lines,message
my ($ts, $level, $msg) = $line =~ m/^([^,]+),([^,]+),(.+)/s; my ($ts, $level, $n_lines, $msg) = $line =~ m/^([^,]+),([^,]+),(.+)/s;
chomp $msg; if ( !$ts || !$level || !$n_lines || !$msg ) {
warn "Invalid log entry: $line\n";
next LINE;
}
if ( $n_lines > 1 ) {
$n_lines--; # first line
for ( 1..$n_lines ) {
$msg .= shift @$lines;
}
}
push @log_entries, Percona::WebAPI::Resource::LogEntry->new( push @log_entries, Percona::WebAPI::Resource::LogEntry->new(
pid => $self->pid, pid => $self->pid,
@@ -159,7 +168,7 @@ sub start_online_logging {
@log_entries = (); @log_entries = ();
} }
} # have log entries } # have log entries
} # QUEUE oktorun } # LINE
if ( scalar @log_entries ) { if ( scalar @log_entries ) {
my $ts = ts(time, 0); # 0=local time my $ts = ts(time, 0); # 0=local time
@@ -241,14 +250,18 @@ sub _log {
my $ts = ts(time, 1); # 1=UTC my $ts = ts(time, 1); # 1=UTC
my $level_number = level_number($level); my $level_number = level_number($level);
chomp($msg);
my $n_lines = 1;
$n_lines++ while $msg =~ m/\n/g;
if ( $self->online_logging ) { if ( $self->online_logging ) {
while ( defined(my $log_entry = shift @{$self->_buffer}) ) { while ( defined(my $log_entry = shift @{$self->_buffer}) ) {
$self->_queue_log_entry(@$log_entry); $self->_queue_log_entry(@$log_entry);
} }
$self->_queue_log_entry($ts, $level_number, $msg); $self->_queue_log_entry($ts, $level_number, $n_lines, $msg);
} }
else { else {
push @{$self->_buffer}, [$ts, $level_number, $msg]; push @{$self->_buffer}, [$ts, $level_number, $n_lines, $msg];
my $ts = ts(time, 0); # 0=local time my $ts = ts(time, 0); # 0=local time
if ( $level_number >= 3 ) { # warning if ( $level_number >= 3 ) { # warning
@@ -264,8 +277,7 @@ sub _log {
sub _queue_log_entry { sub _queue_log_entry {
my ($self, $ts, $log_level, $msg) = @_; my ($self, $ts, $log_level, $msg) = @_;
$msg .= "\n" unless $msg =~ m/\n\Z/; print "$ts,$log_level,$msg\n";
print "$ts,$log_level,$msg";
return; return;
} }