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


25

我使用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重新加载?

Answers:


42

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

为了避免重新加载,您可以复制文件并清空旧文件,而不必移动文件。这样,Apache可以继续写入同一文件句柄。您可以通过在logrotate配置文件中添加“ copytruncate”选项来做到这一点,如下所示:

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

感谢您的回答。所以我猜我添加lastaction echo "" | /apache/*log endscript文件句柄时不是“丢失”吗?
竖琴

3
抱歉,我应该说“ copytruncate”而不是“ copy”。然后,您根本不需要lastaction东西。我怪咖啡因流中血液过多:-)
珍妮D

像魅力一样工作:)
竖琴

4
博士logrotate说,@ harp要小心:“请注意,复制文件和截断文件之间的时间间隔非常短,因此可能会丢失某些日志记录数据。”
Totor

除了可能会丢失某些数据的可能性之外,使用它还有其他已知缺点copytruncate吗?
Leo Galleguillos

5

我建议您使用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

1
如果到Web服务器的流量很大,则管道连接到任何外部程序都可能是一个问题。但这确实避免了文件句柄问题。
珍妮·D

看起来是个不错的选择。cronolog可以即时压缩吗?
竖琴

apache2-utils软件包中有类似的应用程序“ rotatelogs”。请注意不要从不同的Apache虚拟服务器中“管道传输”到相同的日志文件中-它们会相互踩踏。
Arie Skliarouk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.