Package: awstats Version: 6.9.5~dfsg-5 Severity: normal /usr/share/awstats/tools/update.sh is automatically executed by cron, but when the logfiles are rotated the timespan between the last execution time and the current time is missing in the statistics.
This becomes a major issue if people increase the cron interval. A possible solution is to use a wrapper script for the logfiles (see attached getlogs.pl). This script can be used by prepending it to Logfile in /etc/awstats/awstats.conf (e.g. LogFile="getlogs.pl /var/log/apache2/access.log") and getlogs.pl will use access.log.1 and access.log by default. The very same script can also be used in order to create stats for all existing rotated log files by using "all" as a second cli parameter or setting USELOGFILES='all'. The current behavior can be emulated by using 'current' as the second cli parameter. -- System Information: Debian Release: 6.0.7 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.32-5-amd64 (SMP w/1 CPU core) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages awstats depends on: ii perl 5.10.1-17squeeze6 Larry Wall's Practical Extraction Versions of packages awstats recommends: ii coreutils 8.5-1 GNU core utilities ii libnet-xwhois-perl 0.90-3 Whois Client Interface for Perl5 Versions of packages awstats suggests: ii apache2 2.2.16-6+squeeze11 Apache HTTP Server metapackage ii apache2-mpm-worker [h 2.2.16-6+squeeze11 Apache HTTP Server - high speed th pn libgeo-ipfree-perl <none> (no description available) pn libnet-dns-perl <none> (no description available) pn libnet-ip-perl <none> (no description available) pn liburi-perl <none> (no description available) -- no debconf information
#!/usr/bin/perl ## ## getlogs.pl, written by Sven Strickroth <em...@cs-ware.de> (2013) ## ## Provides (possible rotated) logfiles to awstats ## use strict; use File::Basename; if ($#ARGV + 1 < 1 || $#ARGV > 1 || !$ARGV[0]) { print "Call this with ".$0." logfilename [CURRENTLAST|CURRENT|ALL|LAST]\n"; print "\n"; print "If the second parameter is omitted CURRENTLAST (or the content of the environment\n"; print "variable USELOGFILES will be used) will be used by default (i.e. logfilename.1 and\n"; print "logfilename will be printed).\n"; exit 1; } my $path = dirname($ARGV[0]); my $baselogfilename = basename($ARGV[0]); die('Logfile path does not exist: ' . $path . "\n") unless (-d $path); $ARGV[1] = $ENV{'USELOGFILES'} if ($ARGV[1] eq ''); if (lc($ARGV[1]) eq 'last') { if (-f $ARGV[0] . '.1') { &catFile($ARGV[0] . '.1'); } elsif (-f $ARGV[0] . '.1.gz') { &catFile($ARGV[0] . '.1.gz'); } } elsif (lc($ARGV[1]) eq 'all') { opendir(my $dirh, $path) or die ("could not list $path\n"); my @dir = readdir($dirh); closedir($dirh); @dir = grep {$_ =~ /^$baselogfilename/} @dir; my $filenamelen = length($baselogfilename) + 1; # order by number reversed @dir = reverse sort {substr($a, $filenamelen) <=> substr($b, $filenamelen)} @dir; foreach my $entry (@dir) { &catFile($path . '/' . $entry); } } elsif (lc($ARGV[1]) eq 'current') { &catFile($ARGV[0]); } else { if (-f $ARGV[0] . '.1') { &catFile($ARGV[0] . '.1'); } elsif (-f $ARGV[0] . '.1.gz') { &catFile($ARGV[0] . '.1.gz'); } if (-f $ARGV[0]) { &catFile($ARGV[0]); } } exit 0; sub catFile() { my ($file) = @_; if ($file =~ /\.gz$/) { open(my $fh, "gunzip < $file |") or die("could not open $file\n"); while (<$fh>) { print $_; } close($fh); } else { open(my $fh, "<", $file) or die("could not open $file\n"); while (<$fh>) { print $_; } close($fh); } }