如何避免 apache 在旋转日志时重新加载?

如何避免 apache 在旋转日志时重新加载?

我使用 logrotate 来轮转 Apache 访问日志、错误日志和重写日志。我的配置文件如下所示:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

我的问题是,每当发生轮换时,Apache 都必须重新加载,因为 Apache 不会在刚刚轮换的日志文件中写入任何内容。有没有办法避免每次 logrotate 轮换时 Apache 重新加载?

答案1

apache 需要重新加载的原因是,一旦它打开一个文件,它就会获得一个文件句柄,并且它将继续写入该文件句柄。当您移动文件时,它看不到这一点,它只是继续写入同一个句柄。当您重新加载时,它将再次打开文件并获取新句柄。

为了避免重新加载,您可以复制文件并清空旧文件,而不是移动文件。这样 apache 就可以继续写入同一个文件句柄。您可以通过将选项“copytruncate”添加到 logrotate 配置文件来完成此操作,如下所示:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}

答案2

我推荐你使用http://cronolog.org/

这就是我的使用方式:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined

相关内容