【问题标题】:How to follow a (changing) log file in node.js如何在 node.js 中跟踪(更改)日志文件
【发布时间】:2012-03-11 07:44:37
【问题描述】:

好的,这似乎是一个简单的问题,但我无法从这里找到答案,所以我发布它,希望有人可能遇到过类似的问题。

我需要监控一个指向 Web 服务器文件的符号链接(更具体地说,/var/log/lighttpd/error.log,感谢 Linus G ThielI figured out how to follow symlinks)。我知道我可以设置fs.fileWatch 来监视它,但我还应该指出error.log 文件也会在特定时间轮换,具体取决于日志守护程序设置。发生这种情况时,fs.fileWatch 将停止工作。我也知道我可以生成一个子进程并运行

tail -F ./symlink_to_error.log

from node 来解决日志轮换带来的问题,但我更喜欢使用原生 node 函数。任何人都可以对此有所了解吗?

[编辑]

实际上监控实际日志文件没有任何问题,即使日志文件被轮换。该问题实际上是由符号链接引起的。我监视符号链接的原因是因为当大小达到一定限制时实际的日志文件名会发生变化。 /var/log/lighttpd/error.log 仅作为示例给出。我无法控制日志文件的重命名方式,但我确实有一个 crontab,每分钟更新一次符号链接都会更新符号链接。

[ 2012 年 2 月 28 日编辑]

其实我是用下面的方法(通过spawn)

tail -F ./symlink_to_error.log

在我正在从事的一个日志监控项目中,因为它的工作非常可靠,尽管它不如 watchFile() 高效。

【问题讨论】:

    标签: node.js tail fs


    【解决方案1】:

    除了查看符号链接和/或其目标文件之外,还要查看包含目标日志文件的目录,并在“更改”事件中检查日志文件是否已滚动到不同的名称。如果它已经在新的日志文件上设置了一个新的文件观察器。

    fs.watchFile(logDir, function(curr, prev) {
      if (curr.nlink != prev.nlink) {
        // The number of links in the directory has changed, now
        // see if there is a new log file and start watching it.
      }
    });
    

    【讨论】:

    • 感谢 maerics 的回答,但它似乎不起作用。我还尝试将符号链接从软(应该在我的问题中指出)更改为硬(因为在您的解决方案中您正在比较硬链接的数量)。我正在考虑 2 计划 B:1)按预定时间间隔在符号链接上调用 fs.readlink,并在其回调中观察 realfile 2)在节点进程中设置用户信号(例如 SIGUSR1)陷阱并让外部进程更新符号链接更改时发出的信号。当节点进程收到该信号时,再次运行 fs.readlink 以反映更改。
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多