有一个web应用程序(php/apache2),它在请求处理开始时打开一个日志文件,并在处理完成时关闭它(据我所知)。在日志文件打开和关闭之间,条目当然是写入的。
让我们假设,在请求处理的某个地方(即一些日志条目已经写入,还有一些日志条目尚未写入),使用logrotate执行日志旋转,其配置如下:
/var/log/some/path/*.log {
weekly
missingok
rotate 30
compress
delaycompress
notifempty
create <mode> <owner> <group>
size 10M
}如果我理解日志旋转手册页,create指令将使当前日志文件(正在进行的请求处理打开的文件)重命名/移动,并创建一个新的空日志文件。如果是这样,那么对于正在进行的请求处理所生成的未写入日志条目,会发生什么情况?它们会被追加到重命名/移动的文件中,还是会丢失?第二个问题是关于postrotate和或prerotate指令。我在我的案子里需要他们吗?我唯一能想到的是一个apache优雅的重新启动命令,但是我真的需要它吗?
发布于 2011-07-22 13:52:03
答案是apache不会每次附加文件时打开和关闭文件,因为它会造成大量的文件系统开销。它在启动时在日志文件上打开一个文件句柄,并无限期地打开它。
注意,create指令不是用来创建新文件的,它只定义了在发生旋转时给出新文件的所有者和模式。
当apache写入日志文件时,它会写入打开的文件句柄。此句柄仍应附加到现有文件,即使该文件的名称在同一时间内可能发生了更改。这就是最初的apache log旋转式配置包含如下块的原因:
postrotate
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
/etc/init.d/apache2 reload > /dev/null
fi
endscript那是来自Debian的。其他人可能会采取不同的做法,但其结果是导致apache重新加载其配置,从而使其重新打开命名日志文件上的文件句柄。由于log转速刚刚创建了一个新的、空的日志文件,apache将开始写入该文件。
因此,日志条目不会丢失,但是这种旋转形式需要通过postrotate指令定期重新加载。流量很高的服务器的人不喜欢这种限制,可能会倾向于其他一些日志记录方法,比如国防部_日志_铺展
https://serverfault.com/questions/293049
复制相似问题