App-Elog

 view release on metacpan or  search on metacpan

bin/alog  view on Meta::CPAN

    my $cmd = "";
    my $file = $selected_log->{pfile};
    if ($file =~ /\.gz$/) {
        $cmd = "gzip -dc $file";
    }
    if ($opts{max}) {
        if ($opts{offset}) {
            my $amount = $opts{offset} + $opts{max};
            if ($cmd) {
                $cmd .= "| tail -n $amount | head -n $opts{max}";
            }
            else {
                $cmd = "tail -n $amount $file | head -n $opts{max}";
            }
        }
        else {
            if ($cmd) {
                $cmd .= "| tail -n $opts{max}";
            }
            else {
                $cmd = "tail -n $opts{max} $file";
            }
        }
    }
    my $fh;
    if ($cmd) {
        open $fh, "-|", $cmd or die "Can't open $file: $!\n";
    }
    else {
        open $fh, "<", $file or die "Can't open $file: $!\n";
    }
    my $filter = $opts{filter};
    if ($filter) {
        $filter = qr{$filter}i;
    }
    $line_count = 0;

    while (my $line = <$fh>) {
        if ($filter && $line !~ $filter) {
            next;
        }
        $line_count++;
        chomp $line;
        my $a = parse_access_line($line, $selected_log);
        if (!$a || !$a->{date}) {
            # couldn't parse the line
            next;
        }
        $func->($a, $arg);
    }
    close $fh;
}

sub show_list {
    for my $log (@logs) {
        my $selected = $log->{selected} ? "*" : " ";
        my $size = "-";
        my $updated = "";
        if (-e $log->{file}) {
            $size = human_readable(-s $log->{file});
            my $mtime = (stat($log->{file}))[9];
            $updated = time_diff_str($mtime, $now);
        }
        my $file = $log->{file};
        my $line = sprintf "%s %-60s %-10s %s", $selected, $file, $size, $updated;
        print "$line\n";
    }
}

sub show_detailed_list {
    for my $log (@logs) {
        my $size = "-";
        my $updated = "";
        if (-e $log->{file}) {
            $size = human_readable(-s $log->{file});
            my $mtime = (stat($log->{file}))[9];
            $updated = datestr($mtime) . " (" . time_diff_str($mtime, $now) . ")";
        }
        my $vhost = $log->{vhost};
        print "$log->{file}\n";
        if ($log->{selected}) {
            print "    selected\n";
        }
        print "    size $size\n";

        if ($updated) {
            print "    updated $updated\n";
        }
        if ($vhost) {
            if ($vhost->{file}) {
                print "    config $vhost->{file}\n";
            }
            if ($vhost->{docroot}) {
                print "    docroot $vhost->{docroot}\n";
            }
            if ($vhost->{absdocroot}) {
                print "    absdocroot $vhost->{absdocroot}\n";
            }
        }
        if ($log->{fname}) {
            print "    fname $log->{fname}\n";
        }
        if ($log->{format}) {
            print "    format $log->{format}\n";
        }
        my $rotations = get_rotations($log->{file});
        for my $r (@$rotations) {
            my $size = human_readable(-s $r->{file});
            my $mtime = (stat($r->{file}))[9];
            my $updated = datestr($mtime) . " (" . time_diff_str($mtime, $now) . ")";
            print "    rotation $r->{name} $size $updated\n";
        }
    }
}

sub human_readable {
    my ($size) = @_;
    $size ||= 0;
    my @power = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB");
    my $i = 0;
    my $abs_size = abs $size;
    for ($i = 0; $i < @power; $i++) {
        last if $abs_size < 1024;
        $abs_size /= 1024;
    }
    my $str = sprintf("%.1f %s", $abs_size, $power[$i]);
    $str =~ s/\.0//;
    $str = "-$str" if $size < 0;
    return $str;
}

sub select_log {
    my $name = $opts{name};
    if ($name) {
        my $regex = qr/^$name/;
        for my $log (@logs) {
            if ($log->{name} eq $name || $log->{file} eq $name || $log->{name} =~ $regex) {
                select_log_rotation($log);
                last;
            }
        }
        # If the name doesn't match one of the discovered log files,
        # treat it as a filename.
        if (!$selected_log) {
            my $log = add_log($name);
            select_log_rotation($log);
        }
        return;
    }

    if (@logs) {
        my $cwd = Cwd::cwd();
        $cwd .= "/" if $cwd !~ m{/$};
        for my $log (@logs) {
            my $docroot = "";
            if ($log->{vhost} && $log->{vhost}{absdocroot}) {
                $docroot = $log->{vhost}{absdocroot} . "/";
            }
            $log->{begcmp} = begcmp($cwd, $docroot);
        }
        my @logs_sorted = sort {
            return $b->{begcmp} <=> $a->{begcmp} || $a->{name} cmp $b->{name};
        } @logs;

        select_log_rotation($logs_sorted[0]);
    }
}

sub select_log_rotation {



( run in 1.849 second using v1.01-cache-2.11-cpan-5837b0d9d2c )