9

我正在使用 APC 作为操作码和应用程​​序缓存运行 php5 FPM。像往常一样,我将 php 错误记录到文件中。

由于它变得相当大,我尝试配置 logrotate。它可以工作,但在轮换之后,php 继续记录到现有的日志文件,即使它被重命名。这导致 scripts.log 成为 0B 文件,并且 scripts.log.1 继续进一步增长。

我认为(还没有尝试过)在 postrotate 中运行 php5-fpm reload 可以解决这个问题,但这每次都会清除我的 APC 缓存。

有人知道如何使它正常工作吗?

4

2 回答 2

7

我发现 logrotate 的“copytruncate”选项确保 inode 不会改变。基本上是什么 [原文如此!] 正在寻找。

这可能是您正在寻找的。摘自:logrotate 是如何工作的?-Linuxquestions.org

正如我在评论中所写,您需要防止 PHP 写入同一个(重命名的)文件。复制文件通常会创建一个新文件,并且截断也是该选项名称的一部分,所以我认为copytruncate选项是一个简单的解决方案(来自手册页):

  copytruncate

          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

也可以看看:

于 2013-01-03T19:37:39.660 回答
5

我在我的服务器上找到的另一个解决方案是告诉 php 重新打开日志。我觉得nginx也有这个功能,这让我觉得它一定是很常见的地方。这是我的配置:

/var/log/php5-fpm.log {
        rotate 12
        weekly
        missingok
        notifempty
        compress
        delaycompress
        postrotate
                invoke-rc.d php5-fpm reopen-logs > /dev/null
        endscript
}
于 2014-03-26T15:51:43.310 回答