Apache-Log-Parser
view release on metacpan or search on metacpan
bin/analyze_apache_logs view on Meta::CPAN
#!/usr/bin/env perl
### cat logs | analyze_apache_logs
use FindBin;
use lib "$FindBin::Bin/../lib";
use Apache::Log::Parser;
use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
my ($detail, $sort, $verbose);
GetOptions(
"detail|d" => \$detail,
"sort|s=s" => \$sort,
"verbose|v" => \$verbose,
);
$sort = 'duration' if not defined($sort);
die "'sort' option value: 'path', 'num' or 'duration'" if defined($sort) and ($sort ne 'path' and $sort ne 'num' and $sort ne 'duration');
sub avg_subzero2 {
my ($sum, $num) = @_;
sprintf("%.2f", $sum / $num);
}
sub parse_stdin {
my $parser = Apache::Log::Parser->new( fast => [ 'debug', 'combined', 'common' ] );
my $logs = 0;
my $summary = {};
# $summary->{method_str}->{path} = {... };
# path => {
# num => 0,
# status => {},
# bytes => {min => undef, max => undef, sum => 0},
# duration => {min => undef, max => undef, sum => 0},
# queries => {},
# referer => {},
# };
while (my $line = <STDIN>) {
chomp $line;
my $log = $parser->parse($line);
next unless $log;
$logs += 1;
my ($path, $query_string);
if ($detail) {
$path = $log->{path};
}
else {
($path, $query_string) = split(/\?/, $log->{path}, 2);
unless ($query_string) {
$query_string = '(blank)';
}
}
my $method = $log->{method};
$summary->{$method} ||= {};
unless ($summary->{$method}->{$path}) {
$summary->{$method}->{$path} = {
path => undef,
( run in 2.568 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )