1

我正在尝试用 PHP 构建一个小恶魔,用于分析 linux 系统上的日志文件。(例如,遵循系统日志)。

我设法通过打开文件fopen并使用stream_get_line. 我的问题从被监控的文件被删除并重新创建时开始(例如在轮换日志时)。然后程序不再读取任何内容,即使文件变得比以前大。

有没有一个优雅的解决方案? stream_get_meta_data没有帮助,tail -f在命令行上使用显示同样的问题。

编辑,添加了示例代码我试图将代码精简到最低限度来说明我在寻找什么

<?php
$break=FALSE;
$handle = fopen('./testlog.txt', 'r');
do {
    $line = stream_get_line($handle, 100, "\n");
    if(!empty($line)) {
        // do something
        echo $line;
    }
    while (feof($handle)) {
      sleep (5);
      $line = stream_get_line($handle, 100, "\n");
      if(!empty($line)) {
        // do something
        echo $line;
      }
      // a commented on php.net indicated it is possible
      // with tcp streams to distinguish empty and lost
      // does NOT work here  --> need somefunction($handle)
      if($line !== FALSE && $line ='') $break=TRUE;
    }
} while (!$break);
fclose($handle);
?>
4

1 回答 1

2

轮换日志文件时,会复制原始文件,然后将其删除,并创建一个同名的新文件。它可能与原始文件具有相同的名称,但具有不同的 inode。索引节点(下面是简化的描述)就像文件的隐藏增量索引号。您可以更改文件的名称,或移动它,但它需要 inode。删除原始日志文件后,您将无法使用相同的文件处理程序重新打开具有相同名称的文件,因为 inode 已更改。您最好的选择是检测故障,并尝试打开新文件。

于 2012-05-24T16:56:47.200 回答