App-Elog
view release on metacpan or search on metacpan
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 )