【问题标题】:Access log won't log after replacing with a new log file替换为新的日志文件后访问日志不会记录
【发布时间】:2013-11-22 06:57:39
【问题描述】:

我正在尝试对我的 Nginx 服务器上的访问日志文件进行短语访问。

对于文件的措辞,我只需重命名原始访问日志文件并立即创建一个新的访问日志文件,这样我就不会遗漏任何内容。

但替换文件后,Nginx 不会在该文件上记录任何内容,但会在我替换文件之前正常工作。

我重新启动 Nginx 后,Nginx 再次开始记录到替换的文件。

我看不到我做错了什么,有什么帮助吗?

PHP 代码的第一部分

if(rename("access.log", $tempname)){ // I'm renaming the access log file
    $fp = fopen("access.log","wb"); 
    if( $fp == false ){

    }else{
        fwrite($fp,$content); // I'm creating a new access log file
        fclose($fp);
    }
    // I'm phrasing the renamed file here
}

【问题讨论】:

  • 不确定,但我猜 nginx 会为该文件保留一个打开的文件句柄,所以它只有在 nginx 重新启动时才会打开?
  • 所以我阅读了 nginx 的源代码,看起来日志文件仅在程序启动时打开,然后保留文件句柄以用于文件的任何附加。见github.com/nginx/nginx/blob/master/src/core/nginx.c#L280

标签: php apache command-line nginx access-log


【解决方案1】:

正如我在 cmets 中所说,由于 nginx 的性质,可能无法删除该文件,我的建议是使用相同的方法,但不实际删除日志文件。相反,只需清除它。

伪代码

file = open "nginx.log", READ
new_file = open tmpname, WRITE
new_file.write file.contents
file.close
new_file.close
sys_command "cat /dev/null > nginx.log"

或者使用脚本

#!/bin/bash
cp nginx.log nginx.backup.log
cat /dev/null > nginx.log

这样你不会破坏文件并且nginx拥有的文件句柄仍然有效。

【讨论】:

  • 太棒了!谢谢,我只是将您的概念应用到我现有的 PHP 脚本中。
  • 我使用 copy() 函数将 access.log 复制到另一个文件,并使用 @ftruncate PHP 函数清除原始 access.log 文件的内容。再次感谢雨果。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2021-11-06
  • 2014-06-16
相关资源
最近更新 更多