可以将 Apache 配置为使用不同的扩展名写入 access.log 或 error.log 吗?

可以将 Apache 配置为使用不同的扩展名写入 access.log 或 error.log 吗?

我正在调查的事情之一是使用 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();
}

进一步阅读:http://httpd.apache.org/docs/2.2/logs.html#piped

相关内容