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

har*_*arp 27 logrotate apache-httpd

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

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*y D 45

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

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

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
Run Code Online (Sandbox Code Playgroud)

  • @harp 小心,`logrotate` 文档说:“请注意,复制文件和截断文件之间有一个非常小的时间片,所以一些日志数据可能会丢失。” (4认同)
  • 抱歉,我应该说“copytruncate”而不是“copy”。那么你根本不需要 lastaction 的东西。我责怪我的咖啡因流中有太多的血液:-) (3认同)

Bor*_*nov 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
Run Code Online (Sandbox Code Playgroud)