#
# http://www.fabiankeil.de/sourcecode/privoxy-log-parser/
#
-# $Id: privoxy-log-parser.pl,v 1.211 2009/12/30 10:17:28 fk Exp $
+# $Id: privoxy-log-parser.pl,v 1.76 2010/01/11 11:48:23 fabiankeil Exp $
#
# TODO:
# - LOG_LEVEL_CGI, LOG_LEVEL_ERROR, LOG_LEVEL_WRITE content highlighting
use Getopt::Long;
use constant {
- PRIVOXY_LOG_PARSER_VERSION => '0.5',
+ PRIVOXY_LOG_PARSER_VERSION => '0.6',
# Feel free to mess with these ...
DEFAULT_BACKGROUND => 'black', # Choose registered colour (like 'black')
DEFAULT_TEXT_COLOUR => 'white', # Choose registered colour (like 'black')
CLI_OPTION_NO_EMBEDDED_CSS => 0,
CLI_OPTION_NO_MSECS => 0,
CLI_OPTION_NO_SYNTAX_HIGHLIGHTING => 0,
- CLI_OPTION_ERROR_LOG_FILE => '/var/log/privoxy-log.log',
CLI_OPTION_SHOW_INEFFECTIVE_FILTERS => 0,
CLI_OPTION_ACCEPT_UNKNOWN_MESSAGES => 0,
CLI_OPTION_STATISTICS => 0,
PUNISH_MISSING_HIGHLIGHT_KNOWLEDGE_WITH_DEATH => 1,
LOG_UNPARSED_LINES_TO_EXTRA_FILE => 0,
+ ERROR_LOG_FILE => '/var/log/privoxy-log-parser',
# You better leave these alone unless you know what you're doing.
COLOUR_RESET => "\033[0;0m",
'Unsupported HTTP feature' => 'light_red',
Blocked => 'light_red',
Untrusted => 'light_red',
- Redirected => 'green',
+ Redirected => 'green',
'CGI Call' => 'white',
'DNS failure' => 'red',
'Forwarding failed' => 'light_red',
return "" if cli_option_is_set('no-syntax-highlighting');
my %light = (
- black => 0,
- red => 0,
- green => 0,
- brown => 0,
- blue => 0,
- purple => 0,
- cyan => 0,
+ black => 0,
+ red => 0,
+ green => 0,
+ brown => 0,
+ blue => 0,
+ purple => 0,
+ cyan => 0,
light_gray => 0,
gray => 0,
dark_gray => 1,
);
my %text = (
- black => 30,
- red => 31,
- green => 32,
- brown => 33,
- blue => 34,
- purple => 35,
- cyan => 36,
+ black => 30,
+ red => 31,
+ green => 32,
+ brown => 33,
+ blue => 34,
+ purple => 35,
+ cyan => 36,
gray => 37,
light_gray => 37,
dark_gray => 30,
$colour_code .= ";";
$colour_code .= $light{$colour} ? "1" : "2";
$colour_code .= ";";
- $colour_code .= $bg_code;
+ $colour_code .= $bg_code;
$colour_code .= "m";
- debug_message $colour . " is \'" . $colour_code . $colour . $default . "\'" if DEBUG_PAINT_IT;
+ debug_message $colour . " is \'" . $colour_code . $colour . $default . "\'" if DEBUG_PAINT_IT;
} elsif ($colour =~ /reset/) {
} else {
- die "What's $colour supposed to mean?\n";
+ die "What's $colour supposed to mean?\n";
}
return $colour_code;
sub init_css_colours() {
our %css_colours = (
- black => "000",
- red => "F00",
- green => "0F0",
- brown => "C90",
- blue => "0F0",
- purple => "F06", # XXX: wrong
- cyan => "F09", # XXX: wrong
+ black => "000",
+ red => "F00",
+ green => "0F0",
+ brown => "C90",
+ blue => "0F0",
+ purple => "F06", # XXX: wrong
+ cyan => "F09", # XXX: wrong
light_gray => "999",
gray => "333",
dark_gray => "222",
our %css_colours;
my $colour = shift;
- die "What's $colour supposed to mean?\n" unless defined($css_colours{$colour});
+ die "What's $colour supposed to mean?\n" unless defined($css_colours{$colour});
return '#' . $css_colours{$colour};
}
my $css_line;
$css_line .= '.' . lc($class) . ' {'; # XXX: lc() shouldn't be necessary
- die "What's $class supposed to mean?\n" unless defined($h_colours{$class});
+ die "What's $class supposed to mean?\n" unless defined($h_colours{$class});
$css_line .= 'color:' . get_css_colour($h_colours{$class}) . ';';
$css_line .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';';
- $css_line .= '}' . "\n";
+ $css_line .= '}' . "\n";
return $css_line;
}
$css_line .= '.' . lc($colour) . ' {'; # XXX: lc() shouldn't be necessary
$css_line .= 'color:' . get_css_colour($colour) . ';';
$css_line .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';';
- $css_line .= '}' . "\n";
+ $css_line .= '}' . "\n";
return $css_line;
}
$css_line .= '.' . 'default' . ' {';
$css_line .= 'color:' . HEADER_DEFAULT_COLOUR . ';';
$css_line .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';';
- $css_line .= '}' . "\n";
+ $css_line .= '}' . "\n";
return $css_line;
}
$css .= '.privoxy-log {';
$css .= 'color:' . get_css_colour(DEFAULT_TEXT_COLOUR) . ';';
$css .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';';
- $css .= '}' . "\n";
-
+ $css .= '}' . "\n";
+
foreach my $key (keys %h_colours) {
next if ($h_colours{$key} =~ m/reset/); #XXX: Wrong solution.
}
sub get_line_end () {
-
- my $line_end = "\n";
-
- $line_end = '<br>' . $line_end if $html_output_mode;
-
- return $line_end;
+ return cli_option_is_set('html-output') ? "<br>\n" : "\n";
}
sub get_colour_html_markup ($) {
my $colour = shift;
our $bg_code;
my %backgrounds = (
- black => "40",
- red => "41",
- green => "42",
- brown => "43",
- blue => "44",
- magenta => "45",
+ black => "40",
+ red => "41",
+ green => "42",
+ brown => "43",
+ blue => "44",
+ magenta => "45",
cyan => "46",
- white => "47",
- default => "49",
+ white => "47",
+ default => "49",
);
-
+
if (defined($backgrounds{$colour})) {
$bg_code = $backgrounds{$colour};
} else {
sub prepare_highlight_hash ($) {
my $ref = shift;
- if (!$html_output_mode) {
-
- foreach my $key (keys %$ref) {
- $$ref{$key} = paint_it($$ref{$key});
- }
-
- } else {
-
- foreach my $key (keys %$ref) {
- $$ref{$key} = get_semantic_html_markup($key);
- }
-
- }
+ foreach my $key (keys %$ref) {
+ $$ref{$key} = $html_output_mode ?
+ get_semantic_html_markup($key) :
+ paint_it($$ref{$key});
+ }
}
sub prepare_colour_array ($) {
my $ref = shift;
- if (!$html_output_mode) {
-
- foreach my $i (0 ... @$ref - 1) {
- $$ref[$i] = paint_it($$ref[$i]);
- }
-
- } else {
-
- foreach my $i (0 ... @$ref - 1) {
- $$ref[$i] = get_colour_html_markup($$ref[$i]);
- }
-
+ foreach my $i (0 ... @$ref - 1) {
+ $$ref[$i] = $html_output_mode ?
+ get_colour_html_markup($$ref[$i]) :
+ paint_it($$ref[$i]);
}
}
}
################################################################################
-# highlighter functions that aren't loglevel-specific
+# highlighter functions that aren't loglevel-specific
################################################################################
sub h ($) {
log_parser_error($message);
die "Unworthy highlighter function" if PUNISH_MISSING_HIGHLIGHT_KNOWLEDGE_WITH_DEATH;
}
-
+
return $result;
}
sub handle_loglevel_header ($) {
- my $content = shift;
- my $c = $content;
+ my $c = shift;
if ($c =~ /^scan:/) {
- if ($c =~ m/^scan: ((\w+) (.+) (HTTP\/\d\.\d))/) {
-
- # Client request line
- # Save for statistics (XXX: Not implemented yet)
- $req{$t}{'method'} = $2;
- $req{$t}{'destination'} = $3;
- $req{$t}{'http-version'} = $4;
-
- $content = highlight_request_line($1);
-
- } elsif ($c =~ m/^(scan: )((?:HTTP\/\d\.\d|ICY) (\d+) (.*))/) {
-
- # Server response line
- $req{$t}{'response_line'} = $2;
- $req{$t}{'status_code'} = $3;
- $req{$t}{'status_message'} = $4;
- $content = $1 . highlight_response_line($req{$t}{'response_line'});
-
- } elsif ($c =~ m/^scan: ((?>[^:]+)):/) {
+ if ($c =~ m/^scan: ([^: ]+):/) {
# Register new headers
# scan: Accept: image/png,image/*;q=0.8,*/*;q=0.5
update_header_highlight_regex($header);
}
+ } elsif ($c =~ m/^scan: ((\w+) (.+) (HTTP\/\d\.\d))/) {
+
+ # Client request line
+ # Save for statistics (XXX: Not implemented yet)
+ $req{$t}{'method'} = $2;
+ $req{$t}{'destination'} = $3;
+ $req{$t}{'http-version'} = $4;
+
+ $c = highlight_request_line($1);
+
+ } elsif ($c =~ m/^(scan: )((?:HTTP\/\d\.\d|ICY) (\d+) (.*))/) {
+
+ # Server response line
+ $req{$t}{'response_line'} = $2;
+ $req{$t}{'status_code'} = $3;
+ $req{$t}{'status_message'} = $4;
+ $c = $1 . highlight_response_line($req{$t}{'response_line'});
}
} elsif ($c =~ m/^Crunching (?:server|client) header: .* \(contains: ([^\)]*)\)/) {
# Crunching server header: Set-Cookie: trac_form_token=d5308c34e16d15e9e301a456; (contains: Cookie:)
- $content =~ s@(?<=contains: )($1)@$h{'crunch-pattern'}$1$h{'Standard'}@;
- $content =~ s@(Crunching)@$h{$1}$1$h{'Standard'}@;
+ $c =~ s@(?<=contains: )($1)@$h{'crunch-pattern'}$1$h{'Standard'}@;
+ $c =~ s@(Crunching)@$h{$1}$1$h{'Standard'}@;
} elsif ($c =~ m/^New host is: ([^\s]*)\./) {
- # New host is: trac.vidalia-project.net. Crunching Referer: http://www.vidalia-project.net/
- $c = highlight_matched_host($c, '(?<=New host is: )[^\s]+');
- $content = highlight_matched_url($c, '(?<=Crunching Referer: )[^\s]+');
+ # New host is: trac.vidalia-project.net. Crunching Referer: http://www.vidalia-project.net/!
+ $c = highlight_matched_host($c, '(?<=New host is: )[^\s]+(?=\.)');
+ $c = highlight_matched_url($c, '(?<=Crunching Referer: )[^\s!]+');
} elsif ($c =~ m/^Text mode enabled by force. (Take cover)!/) {
# Text mode enabled by force. Take cover!
- $content =~ s@($1)@$h{'warning'}$1$h{'Standard'}@;
+ $c =~ s@($1)@$h{'warning'}$1$h{'Standard'}@;
} elsif ($c =~ m/^(New HTTP Request-Line: )(.*)/) {
# New HTTP Request-Line: GET http://www.privoxy.org/ HTTP/1.1
- $content = $1 . highlight_request_line($2);
+ $c = $1 . highlight_request_line($2);
} elsif ($c =~ m/^Adjust(ed)? Content-Length to \d+/) {
# Adjusted Content-Length to 2132
# Adjust Content-Length to 33533
- $content =~ s@(?<=Content-Length to )(\d+)@$h{'Number'}$1$h{'Standard'}@;
- $content = highlight_known_headers($content);
+ $c =~ s@(?<=Content-Length to )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c = highlight_known_headers($c);
} elsif ($c =~ m/^Destination extracted from "Host:" header. New request URL:/) {
# Destination extracted from "Host:" header. New request URL: http://www.cccmz.de/~ridcully/blog/
- $content = highlight_matched_url($content, '(?<=New request URL: ).*');
+ $c = highlight_matched_url($c, '(?<=New request URL: ).*');
} elsif ($c =~ m/^Couldn\'t parse:/) {
# XXX: These should probable be logged with LOG_LEVEL_ERROR
# Couldn't parse: If-Modified-Since: Wed, 21 Mar 2007 16:34:50 GMT (crunching!)
# Couldn't parse: at, 24 Mar 2007 13:46:21 GMT in If-Modified-Since: Sat, 24 Mar 2007 13:46:21 GMT (crunching!)
- $content =~ s@^(Couldn\'t parse)@$h{'error'}$1$h{'Standard'}@;
+ $c =~ s@^(Couldn\'t parse)@$h{'error'}$1$h{'Standard'}@;
} elsif ($c =~ /^Tagger \'([^\']*)\' added tag \'([^\']*)\'/ or
$c =~ m/^Adding tag \'([^\']*)\' created by header tagger \'([^\']*)\'/) {
# XXX: Save tag and tagger
- $content =~ s@(?<=^Tagger \')([^\']*)@$h{'tagger'}$1$h{'Standard'}@;
- $content =~ s@(?<=added tag \')([^\']*)@$h{'tag'}$1$h{'Standard'}@;
- $content =~ s@(?<=Action bits )(updated)@$h{'action-bits-update'}$1$h{'Standard'}@;
+ $c =~ s@(?<=^Tagger \')([^\']*)@$h{'tagger'}$1$h{'Standard'}@;
+ $c =~ s@(?<=added tag \')([^\']*)@$h{'tag'}$1$h{'Standard'}@;
+ $c =~ s@(?<=Action bits )(updated)@$h{'action-bits-update'}$1$h{'Standard'}@;
$no_special_header_highlighting = 1;
} elsif ($c =~ /^Tagger \'([^\']*)\' didn['']t add tag \'([^\']*)\'/) {
# Tagger 'revalidation' didn't add tag 'REVALIDATION-REQUEST'. Tag already present
# XXX: Save tag and tagger
- $content =~ s@(?<=^Tagger \')([^\']*)@$h{'tag'}$1$h{'Standard'}@;
- $content =~ s@(?<=didn['']t add tag \')([^\']*)@$h{'tagger'}$1$h{'Standard'}@;
+ $c =~ s@(?<=^Tagger \')([^\']*)@$h{'tag'}$1$h{'Standard'}@;
+ $c =~ s@(?<=didn['']t add tag \')([^\']*)@$h{'tagger'}$1$h{'Standard'}@;
} elsif ($c =~ m/^(?:scan:|Randomiz|addh:|Adding:|Removing:|Referer:|Modified:|Accept-Language header|[Cc]ookie)/
or $c =~ m/^(Text mode is already enabled|Denied request with NULL byte|Replaced:|add-unique:)/
# crunched User-Agent!
# Crunching: Content-Encoding: gzip
- $content =~ s@(Crunching|crunched)@$h{$1}$1$h{'Standard'}@;
+ $c =~ s@(Crunching|crunched)@$h{$1}$1$h{'Standard'}@;
} elsif ($c =~ m/^Offending request data with NULL bytes turned into \'°\' characters:/) {
-
+
# Offending request data with NULL bytes turned into '°' characters: °°n°°(°°°
- $content = h('warning') . $content . h('Standard');
-
+ $c = h('warning') . $c . h('Standard');
+
} elsif ($c =~ m/^(Transforming \")(.*?)(\" to \")(.*?)(\")/) {
# Transforming "Proxy-Authenticate: Basic realm="Correos Proxy Server"" to\
# "Proxy-Authenticate: Basic realm="Correos Proxy Server""
- $content =~ s@(?<=^Transforming \")(.*)(?=\" to)@$h{'Header'}$1$h{'Standard'}@;
- $content =~ s@(?<=to \")(.*)(?=\")@$h{'Header'}$1$h{'Standard'}@;
+ $c =~ s@(?<=^Transforming \")(.*)(?=\" to)@$h{'Header'}$1$h{'Standard'}@;
+ $c =~ s@(?<=to \")(.*)(?=\")@$h{'Header'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Removing empty header/) {
# Content-Type: application/octet-stream not replaced. It doesn't look like text.\
# Enable force-text-mode if you know what you're doing.
# XXX: Could highlight more here.
- $content =~ s@(?<=^Content-Type: )(.*)(?= not replaced)@$h{'content-type'}$1$h{'Standard'}@;
+ $c =~ s@(?<=^Content-Type: )(.*)(?= not replaced)@$h{'content-type'}$1$h{'Standard'}@;
} elsif ($c =~ m/^(Server|Client) keep-alive timeout is/) {
# Server keep-alive timeout is 5. Sticking with 10.
# Client keep-alive timeout is 20. Sticking with 10.
- $content =~ s@(?<=timeout is )(\d+)@$h{'Number'}$1$h{'Standard'}@;
- $content =~ s@(?<=Sticking with )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<=timeout is )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<=Sticking with )(\d+)@$h{'Number'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Reducing keep-alive timeout/) {
# Reducing keep-alive timeout from 60 to 10.
- $content =~ s@(?<= from )(\d+)@$h{'Number'}$1$h{'Standard'}@;
- $content =~ s@(?<= to )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<= from )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $c =~ s@(?<= to )(\d+)@$h{'Number'}$1$h{'Standard'}@;
} else {
- found_unknown_content($content);
+ found_unknown_content($c);
}
- # Highlight headers
+ # Highlight headers
unless ($c =~ m/^Transforming/) {
- $content = highlight_known_headers($content) unless $no_special_header_highlighting;
+ $c = highlight_known_headers($c) unless $no_special_header_highlighting;
}
- return $content;
+ return $c;
}
sub handle_loglevel_re_filter ($) {
$req{$t}{'header_filter_name'} =~ m/^privoxy-filter-test$/) {
return '';
}
- $content =~ s@(?<=\(size )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ $content =~ s@(?<=\(size )(\d+)@$h{'Number'}$1$h{'Standard'}@;
$content =~ s@($req{$t}{'header_filter_name'})@$h{'filter'}$1$h{'Standard'}@;
} elsif ($c =~ m/^ ?\.\.\. ?produced (\d*) hits \(new size (\d*)\)\./) {
if ($req{$t}{'header_filter_hits'} == 0 and
not (defined($req{$t}{'header_filter_name'}) and
$req{$t}{'header_filter_name'} =~ m/^privoxy-filter-test$/)) {
- return '';
+ return '';
}
# Reformat including information from the intro
$c = "'" . h('filter') . $req{$t}{'header_filter_name'} . h('Standard') . "'";
}
# Highlight from last line (XXX: What?)
- # $c =~ s@(?<=produced )(\d+)@$h{'Number'}$1$h{'Standard'}@;
+ # $c =~ s@(?<=produced )(\d+)@$h{'Number'}$1$h{'Standard'}@;
# $c =~ s@($req{$t}{'header_filter_name'})@$h{'filter'}$1$h{'Standard'}@;
} else {
} elsif ($content =~ m/^failed! \(gif parsing\)/) {
# failed! (gif parsing)
- # XXX: Replace this error message with something less stupid
+ # XXX: Replace this error message with something less stupid
$content =~ s@(failed!)@$h{'error'}$1$h{'Standard'}@;
} elsif ($content =~ m/^Need to de-chunk first/) {
found_unknown_content($content);
}
-
+
return $content;
}
$c = highlight_matched_host($c, '(?<=from )[^\s]+'); # XXX: not an URL
} elsif ($c =~ m/^socks5_connect:/) {
-
+
$c =~ s@(?<=socks5_connect: )(.*)@$h{'error'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Created new connection to/) {
found_unknown_content($c);
}
-
+
return $c;
}
sub handle_loglevel_info ($) {
my $c = shift;
-
+
if ($c =~ m/^Rewrite detected:/) {
# Rewrite detected: GET http://10.0.0.2:88/blah.txt HTTP/1.1
$c =~ s@(?<=loading configuration file \')([^\']*)@$h{'file'}$1$h{'Standard'}@;
} elsif ($c =~ m/^exiting by signal/) {
-
+
# exiting by signal 15 .. bye
$c =~ s@(?<=exiting by signal )(\d+)@$h{'signal'}$1$h{'Standard'}@;
} elsif ($c =~ m/^Privoxy version/) {
-
+
# Privoxy version 3.0.7
$c =~ s@(?<=^Privoxy version )(\d+\.\d+\.\d+)$@$h{'version'}$1$h{'Standard'}@;
my $c = shift;
if ($c =~ m/^Granting access to/) {
-
+
#Granting access to http://config.privoxy.org/send-stylesheet, referrer http://p.p/ is trustworthy.
} elsif ($c =~ m/^Substituting: s(.)/) {
-
+
# Substituting: s/@else-not-FEATURE_ZLIB@.*@endif-FEATURE_ZLIB@//sigTU
# XXX: prone to span several lines
my $c = shift;
if ($c =~ m/^Ignored force prefix in request:/) {
-
+
# Ignored force prefix in request: "GET http://10.0.0.1/PRIVOXY-FORCE/block HTTP/1.1"
$c =~ s@^(Ignored)@$h{'ignored'}$1$h{'Standard'}@;
$c = highlight_matched_request_line($c, '(?<=request: ")[^"]*');
} elsif ($c =~ m/^Enforcing request:/) {
-
+
# Enforcing request: "GET http://10.0.0.1/block HTTP/1.1".
$c = highlight_matched_request_line($c, '(?<=request: ")[^"]*');
sub gather_loglevel_connect_stats ($$) {
- my $c = shift;
- my $thread = shift;
+ my ($c, $thread) = @_;
our %thread_data;
our %stats;
}
}
-sub gather_loglevel_header_stats ($) {
+sub gather_loglevel_header_stats ($$) {
- my $c = shift;
- my $thread = shift;
+ my ($c, $thread) = @_;
our %stats;
if ($c =~ m/^A HTTP\/1\.1 response without/ or
sub print_non_clf_message ($) {
my $content = shift;
- my $log_level = $req{$t}{'log-level'};
my $msec_string = "." . $req{$t}{'msecs'} unless $no_msecs_mode;
- my $thread_color_string = $thread_colours{$t} if defined($thread_colours{$t});
- my $log_level_string = $h{$log_level} if defined($h{$log_level});
+ my $line_start = $html_output_mode ? '' : $h{"Standard"};
return if DEBUG_SUPPRESS_LOG_MESSAGES;
- print $h{Standard}
+ print $line_start
. $time_colours[$time_colour_index % 2]
. $req{$t}{'time-stamp'}
. $msec_string
. $h{Standard} . " "
- . $thread_color_string
+ . $thread_colours{$t}
. $t
. $h{Standard}
. " "
- . $log_level_string
- . $log_level
+ . $h{$req{$t}{'log-level'}}
+ . $req{$t}{'log-level'}
. $h{Standard}
. ": "
. $content
);
while (<>) {
-
+
if (m/^(\w{3} \d{2}) (\d\d:\d\d:\d\d)\.?(\d+)? (?:Privoxy\()?([^\)\s]*)[\)]? ([\w -]*): (.*?)\r?$/) {
$thread = $t = $4;
$req{$t}{'day'} = $day = $1;
} else {
die "No handler found for log level \"$log_level\"\n";
-
}
- # Highlight Truncations
- if (m/\.\.\. \[(too long, truncated)/) {
- $content =~ s@($1)@$h{'Truncation'}$1$h{'Standard'}@g;
+ # Highlight Truncations
+ if (length($_) > 4000) {
+ $content =~ s@(too long, truncated)]$@$h{'Truncation'}$1$h{'Standard'}]@g;
}
next unless $content;
# Switch timestamp colour if timestamps differ
if (($msecs ne $last_msecs) || ($time_stamp ne $last_timestamp)) {
debug_message("Tick tack!") if DEBUG_TICKS;
- $time_colour = $time_colours[$time_colour_index % 2];
+ $time_colour = $time_colours[$time_colour_index % 2];
$time_colour_index++;
$last_msecs = $msecs;
$last_timestamp = $time_stamp;
our ($ip, $timestamp, $request_line, $status_code, $size) = ($1, $2, $3, $4, $5);
print_clf_message();
-
+
} else {
# Some Privoxy log messages span more than one line,
sub stats_loop () {
- my ($day, $time_stamp, $thread, $log_level, $content, $c, $msecs);
+ my ($day, $time_stamp, $msecs, $thread, $log_level, $content);
my %log_level_handlers = (
'Re-Filter' => \&handle_loglevel_ignore,
'Header' => \&gather_loglevel_header_stats,
$day = $1;
$time_stamp = $2;
$msecs = $3 ? $3 : 0;
- $log_level = $5;
- $content = $c = $6;
$thread = $4;
+ $log_level = $5;
+ $content = $6;
if (defined($log_level_handlers{$log_level})) {
'show-ineffective-filters' => CLI_OPTION_SHOW_INEFFECTIVE_FILTERS,
'accept-unknown-messages' => CLI_OPTION_ACCEPT_UNKNOWN_MESSAGES,
'statistics' => CLI_OPTION_STATISTICS,
- );
+ );
GetOptions (
'html-output' => \$cli_options{'html-output'},
- (in some cases) calculates additional information,
like the compression ratio or how a filter affected
the content size.
-
+
With B<privoxy-log-parser> you should be able to increase Privoxy's log level
without getting confused by the resulting amount of output. For example for
"debug 64" B<privoxy-log-parser> will (by default) only show messages that
[B<--statistics>] Gather various statistics instead of syntax highlighting
log messages. This is an experimental feature, if the results look wrong
-they very well might be. Also note that the results a pretty much guaranteed
+they very well might be. Also note that the results are pretty much guaranteed
to be incorrect if Privoxy and Privoxy-Log-Parser aren't in sync.
[B<--version>] Print version and exit.