#
# http://www.fabiankeil.de/sourcecode/privoxy-log-parser/
#
-# $Id: privoxy-log-parser.pl,v 1.156 2009/07/13 17:16:53 fk Exp $
+# $Id: privoxy-log-parser.pl,v 1.51 2009/09/22 11:33:23 fabiankeil Exp $
#
# TODO:
# - LOG_LEVEL_CGI, LOG_LEVEL_ERROR, LOG_LEVEL_WRITE content highlighting
CLI_OPTION_ERROR_LOG_FILE => '/var/log/privoxy-log.log',
CLI_OPTION_SHOW_INEFFECTIVE_FILTERS => 0,
CLI_OPTION_ACCEPT_UNKNOWN_MESSAGES => 0,
- CLI_OPTION_STATISTIC => 0,
SUPPRESS_SUCCEEDED_FILTER_ADDITIONS => 1,
SHOW_SCAN_INTRO => 0,
$c =~ s@(?<=failed: )(.*)@$h{'error'}$1$h{'Standard'}@;
- } elsif ($c =~ m/^to ([^\s]*) successful$/) {
+ } elsif ($c =~ m/^to ([^\s]*)( successful)?$/) {
# Connect: to www.nzherald.co.nz successful
+ # Connect: to archiv.radiotux.de
return '' if SUPPRESS_SUCCESSFUL_CONNECTIONS;
$c = highlight_matched_host($c, '(?<=to )[^\s]+');
} elsif ($c =~ m/^The connection to/) {
# The connection to www.privoxy.org:80 in slot 6 timed out. Closing socket 19. Timeout is: 61.
+ # 3.0.15 and later:
+ # The connection to 1.bp.blogspot.com:80 in slot 0 timed out. Closing socket 5.\
+ # Timeout is: 1. Assumed latency: 4.
# The connection to 10.0.0.1:80 in slot 0 is no longer usable. Closing socket 4.
$c = highlight_matched_host($c, '(?<=connection to )[^\s]+');
$c =~ s@(?<=in slot )(\d+)@$h{'Number'}$1$h{'Standard'}@;
$c =~ s@(?<=Closing socket )(\d+)@$h{'Number'}$1$h{'Standard'}@;
$c =~ s@(?<=Timeout is: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<=Assumed latency: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+
+ } elsif ($c =~ m/^Stopped waiting for the request line./) {
+
+ # Stopped waiting for the request line. Timeout: 121.
+ $c =~ s@(?<=Timeout: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Waiting for \d/) {
# Done reading from server. Expected content length: 24892. \
# Actual content length: 24892. Most recently received: 4412.
- $c =~ s@(?<=Expected content length: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
- $c =~ s@(?<=Actual content length: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ # 3.0.15 and later:
+ # Done reading from server. Expected content length: 24892. \
+ # Actual content length: 24892. Bytes most recently read: 4412.
+ # Done reading from server. Content length: 6018 as expected. \
+ # Bytes most recently read: 294.
+ $c =~ s@(?<=ontent length: )(\d+)@$h{'Number'}$1$h{'Standard'}@g;
$c =~ s@(?<=received: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<=read: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Continuing buffering headers/) {
$c =~ s@(?<=byte_count: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
$c =~ s@(?<=header_offset: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
$c =~ s@(?<=len: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ # 3.0.15 and later:
+ # Continuing buffering headers. Bytes most recently read: %d.
+ $c =~ s@(?<=read: )(\d+)@$h{'Number'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Received \d+ bytes while/) {
$c =~ s@(?<=server socket )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ } elsif ($c =~ m/^Reduced expected bytes to /) {
+
+ # Reduced expected bytes to 0 to account for the 1542 ones we already got.
+ $c =~ s@(?<=bytes to )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<=for the )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+
+ } elsif ($c =~ m/^The client closed socket /) {
+
+ # The client closed socket 2 while the server socket 4 is still open.
+ $c =~ s@(?<=closed socket )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<=server socket )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+
} elsif ($c =~ m/^Looks like we rea/ or
$c =~ m/^Unsetting keep-alive flag/ or
$c =~ m/^No connections to wait/ or
$c =~ m/^Complete client request received/ or
$c =~ m/^Possible pipeline attempt detected./ or
$c =~ m/^POST request detected. The connection will not be kept alive./ or
- $c =~ m/^The server still wants to talk, but the client hung up on us./) {
+ $c =~ m/^The server still wants to talk, but the client hung up on us./ or
+ $c =~ m/^The server didn't specify how long the connection will stay open/ or
+ $c =~ m/^There might be a request body. The connection will not be kept alive/ or
+ $c =~ m/^Stopping to watch the client socket. There's already another request waiting./) {
# Looks like we reached the end of the last chunk. We better stop reading.
# Looks like we read the end of the last chunk together with the server \
# kept alive and we will only serve the first request.
# POST request detected. The connection will not be kept alive.
# The server still wants to talk, but the client hung up on us.
+ # The server didn't specify how long the connection will stay open. Assume it's only a second.
+ # There might be a request body. The connection will not be kept alive.
+ # Stopping to watch the client socket. There's already another request waiting.
} else {
return $c;
}
+sub handle_loglevel_error ($) {
+
+ my $c = shift;
+ our %h;
+
+ if ($c =~ m/^Empty server or forwarder response received on socket \d+./) {
+
+ # Empty server or forwarder response received on socket 4.
+ $c =~ s@(?<=on socket )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ }
+ # XXX: There are probably more messages that deserve highlighting.
+
+ return $c;
+}
+
+
sub handle_loglevel_ignore ($) {
return shift;
}
my $time_colour;
our $no_special_header_highlighting;
$time_colour = paint_it('white');
- my %log_level_count;
my %log_level_handlers = (
'Re-Filter' => \&handle_loglevel_re_filter,
'Info' => \&handle_loglevel_info,
'CGI' => \&handle_loglevel_cgi,
'Force' => \&handle_loglevel_force,
- 'Error' => \&handle_loglevel_ignore,
+ 'Error' => \&handle_loglevel_error,
'Fatal error' => \&handle_loglevel_ignore,
'Writing' => \&handle_loglevel_ignore,
'Unknown log level' => \&handle_loglevel_ignore,
$output = '';
- if (m/^(\w{3} \d{2}) (\d\d:\d\d:\d\d)\.?(\d+)? (?:Privoxy\()?([^\)\s]*)[\)]? ([\w -]*): (.*)$/) {
+ if (m/^(\w{3} \d{2}) (\d\d:\d\d:\d\d)\.?(\d+)? (?:Privoxy\()?([^\)\s]*)[\)]? ([\w -]*): (.*?)\r?$/) {
# XXX: Put in req hash?
$day = $1;
$time_stamp = $2;
$req{$t}{'log-message'} = $_;
$no_special_header_highlighting = 0;
- $log_level_count{$log_level}++;
-
if (defined($log_level_handlers{$log_level})) {
$content = $log_level_handlers{$log_level}($content);
}
}
}
-
- if (cli_option_is_set('statistic')) {
- foreach (keys %log_level_count) {
- print $_ . ": " . $log_level_count{$_} . " ";
- }
- }
}
sub VersionMessage {
'no-msecs' => CLI_OPTION_NO_MSECS,
'show-ineffective-filters' => CLI_OPTION_SHOW_INEFFECTIVE_FILTERS,
'accept-unknown-messages' => CLI_OPTION_ACCEPT_UNKNOWN_MESSAGES,
- 'statistic' => CLI_OPTION_STATISTIC,
);
GetOptions (
'no-msecs' => \$cli_options{'no-msecs'},
'show-ineffective-filters' => \$cli_options{'show-ineffective-filters'},
'accept-unknown-messages' => \$cli_options{'accept-unknown-messages'},
- 'statistic' => \$cli_options{'statistic'},
'version' => sub { VersionMessage && exit(0) }
);
}