我使用 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