The first issue is solved by having a process that rotates the logs run by cron at certain times (usually off-peak hours, if this term is still valid in the 24-hour global Internet era). Usually, log rotation includes renaming the current log file, restarting the server (which creates a fresh new log file), and compressing and/or moving the rotated log file to a different disk.
For example, if we want to rotate the access_log file, we could do:
panic% mv access_log access_log.renamed panic% apachectl graceful panic% sleep 5 panic% mv access_log.renamed /some/directory/on/another/disk
The sleep delay is added to make sure that all children complete requests and logging. It's possible that a longer delay is needed. Once the restart is completed, it is safe to use access_log.renamed.
There are several popular utilities, such as rotatelogs and cronolog, that can perform the rotation, although it is also easy to create a basic rotation script. Example 5-10 shows a script that we run from cron to rotate our log files.
#!/usr/local/bin/perl -Tw # This script does log rotation. Called from crontab. use strict; $ENV{PATH}='/bin:/usr/bin'; delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; ### configuration my @logfiles = qw(access_log error_log); umask 0; my $server = "httpd_perl"; my $logs_dir = "/home/httpd/$server/logs"; my $restart_command = "/home/httpd/$server/bin/apachectl restart"; my $gzip_exec = "/usr/bin/gzip -9"; # -9 is maximum compression my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time); my $time = sprintf "%0.4d.%0.2d.%0.2d-%0.2d.%0.2d.%0.2d", $year+1900, ++$mon, $mday, $hour, $min, $sec; chdir $logs_dir; # rename log files foreach my $file (@logfiles) { rename $file, "$file.$time"; } # now restart the server so the logs will be restarted system $restart_command; # allow all children to complete requests and logging sleep 5; # compress log files foreach my $file (@logfiles) { system "$gzip_exec $file.$time"; }
As can be seen from the code, the rotated files will include the date and time in their filenames.
 
Continue to: