Одна из вещей, которые я исследую, - это использование опции dateext для logrotate. Однако, если я все правильно понял, apache продолжит писать в файлы access.log и error.log.
Мне было интересно, есть ли способ иметь журнал apache в файле access.log.YYYYMMDD и error.log.YYYYMMDD вместо этого? Где ГГГГММДД - это отметка времени, когда файл был создан.
Apache поставляется с ротация журналов который делает именно то, что вы ищете.
CustomLog "|/usr/bin/rotatelogs -l /var/logs/apache2/access.log.%Y%m%d 86400" combined
ErrorLog "|/usr/bin/rotatelogs -l /var/logs/apache2/error.log.%Y%m%d 86400"
Или вы можете написать свой собственный небольшой скрипт, который сделает это. Apache снова передает его журнал в STDIN этого сценария, используя следующий синтаксис
CustomLog |/path/to/logger.pl combined
Ваш скрипт читает строки журнала на STDIN и записывает их в файл журнала, имя которого вы можете свободно выбирать и изменять.
Скрипт может выглядеть примерно так
#!/usr/bin/perl
use warnings;
use strict;
use Time::Local;
use IO::Handle;
my $logfilePrefix = '/var/log/apache2/access.log.';
my $rotateAt;
openLog();
while(my $l = <STDIN>)
{
reopenLog() if(time() >= $rotateAt);
print LOG $l;
}
close(LOG);
exit 0;
sub openLog
{
my ($day, $month, $year) = (localtime)[3,4,5];
my $logfile = $logfilePrefix.sprintf("%04d%02d%02d", $year+1900, $month+1, $day);
$rotateAt = timelocal(0, 0, 0, (localtime(time() + 86400))[3,4,5]);
open(LOG, ">> $logfile") || die "couldn't write to $logfile: $!\n";
LOG->autoflush(1);
}
sub reopenLog
{
close(LOG);
openLog();
}
Дальнейшее чтение: http://httpd.apache.org/docs/2.2/logs.html#piped