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 )