我被告知,我们(脚本)每天重新启动apache已经build立,因为我们的日志轮换。 值得关注的是,如果logrotate在apache运行并接受请求的时候旋转,logrotate可能会在访问日志中丢失一行。
有人可以告诉我这是否合理,真实或完全废话?
在日志文件被转动之后,您需要重新启动服务器,因为Apache保持打开日志的文件句柄,并且如果不这样,将继续写入旧的日志文件。 将USR1发送给父母(正常重启)应该是有用的。
参考: 1.3,2.2
从2.2文档引用:
在即使是繁忙的服务器上,存储在日志文件中的信息量也非常大。 访问日志文件通常每10,000个请求增长1 MB或更多。 因此有必要通过移动或删除现有日志来定期轮换日志文件。 在服务器运行时,这是不能完成的,因为只要保持打开的文件,Apache就会继续写入旧的日志文件。 相反,在日志文件被移动或删除之后,必须重新启动服务器,以便它将打开新的日志文件。
通过使用平稳的重新启动,可以指示服务器打开新的日志文件,而不会丢失客户端的任何现有或挂起的连接。 但是,为了实现这一点,服务器在完成旧服务请求时必须继续写入旧的日志文件。 因此,在对日志文件进行任何处理之前,需要等待一段时间后重新启动。 简单地旋转日志并压缩旧日志以节省空间的典型场景是:
mv access_log access_log.old mv error_log error_log.old apachectl graceful sleep 600 gzip access_log.old error_log.old
执行日志循环的另一种方法是使用pipe道日志,如下一节所述。
完全合理。 取决于你如何阻止Apache。
如果你正在做一个每晚HUP让服务器启动新的日志,那么你应该没有问题。 任何笨拙的停止和重新启动,你自己的,但你自己!
但是,夜间HUP中的任何连接都将丢失,这些下注者将不得不重新连接。 如果他们正处于一个大的下载的中间位可惜!
如果您将logging的字节logging为请求的一部分,则在下载完成之前不会logging连接,因此,由于HUP而丢失的连接将从日志中丢失。
你看过新的2.2.12版吗?
其中一个变化是使“通过rotatelogs传递”更加健壮,这样您就可以将rotate转发到rotatelogs实用程序,并且无需执行每晚的HUP就可以让它顶部和尾部的日志。 所以,如果你的日志字节服务,没有丢失的连接和没有丢失的日志事务
医生的话说
旋转发生在这个间隔的开始。 例如,如果轮换时间是3600,则日志文件将在每小时的开始处旋转; 如果轮换时间是86400,则日志文件将在午夜每晚旋转。
如果你看看rotatelogs的内容,那么他们是如何做这件事的并不明显,因为在find这一行之前,根本就没有魔法数字:
tLogStart = (now / tRotation) * tRotation;
这将使开始时间与当前小时(对于tRotation == 3600)或上一个午夜(对于tRotation == 86400)的开始alignment。 谁知道它会为其他数字做什么,例如16432?
编辑:我忘了说,我们已经看到优雅的问题不performance得很优雅。 具体来说,只是留下儿童进程。 这似乎已经被确认,因为v2.2.12现在有一个新的configuration指令GracefulShutdownTimeout,它指定了一个超时后,httpd进程终止,而不pipe任何请求被服务。
HTH
“Avahappy,
为什么要放弃这样一个大问题? 如果那么重要的话,可能需要把日志打印到绿条上作为备份。
是的,根据其他答案,问题是,Apache将继续写入它已经打开的文件句柄。
我们(和许多其他人)使用cronlog来避免这种情况。 在这个设置中,apache将日志传送给cronolog,并且服务器不需要重新启动/重新加载。