我正在调查的事情之一是使用 logrotate 的 dateext 选项。但是,如果我理解正确的话,apache 将继续写入文件 access.log 和 error.log。
我想知道是否有办法让 apache 将日志记录到文件 access.log.YYYYMMDD 和 error.log.YYYYMMDD 中?其中 YYYYMMDD 是文件创建的时间戳。
答案1
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();
}