首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解log旋转式的创建指令

理解log旋转式的创建指令
EN

Server Fault用户
提问于 2011-07-22 12:41:21
回答 1查看 528关注 0票数 0

有一个web应用程序(php/apache2),它在请求处理开始时打开一个日志文件,并在处理完成时关闭它(据我所知)。在日志文件打开和关闭之间,条目当然是写入的。

让我们假设,在请求处理的某个地方(即一些日志条目已经写入,还有一些日志条目尚未写入),使用logrotate执行日志旋转,其配置如下:

代码语言:javascript
复制
/var/log/some/path/*.log {
  weekly
  missingok
  rotate 30
  compress
  delaycompress
  notifempty
  create <mode> <owner> <group>
  size 10M
}

如果我理解日志旋转手册页,create指令将使当前日志文件(正在进行的请求处理打开的文件)重命名/移动,并创建一个新的空日志文件。如果是这样,那么对于正在进行的请求处理所生成的未写入日志条目,会发生什么情况?它们会被追加到重命名/移动的文件中,还是会丢失?第二个问题是关于postrotate和或prerotate指令。我在我的案子里需要他们吗?我唯一能想到的是一个apache优雅的重新启动命令,但是我真的需要它吗?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2011-07-22 13:52:03

答案是apache不会每次附加文件时打开和关闭文件,因为它会造成大量的文件系统开销。它在启动时在日志文件上打开一个文件句柄,并无限期地打开它。

注意,create指令不是用来创建新文件的,它只定义了在发生旋转时给出新文件的所有者和模式。

当apache写入日志文件时,它会写入打开的文件句柄。此句柄仍应附加到现有文件,即使该文件的名称在同一时间内可能发生了更改。这就是最初的apache log旋转式配置包含如下块的原因:

代码语言:javascript
复制
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指令定期重新加载。流量很高的服务器的人不喜欢这种限制,可能会倾向于其他一些日志记录方法,比如国防部_日志_铺展

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/293049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档