2012-02-20 56 views
4

好吧,看起来这可能是一个简单的问题,但我无法从这里找到答案,所以我发布了它,希望有人可能遇到类似问题。如何关注node.js中的(更改)日志文件

我需要监视一个指向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 

来解决所造成的日志轮换的问题,但我更喜欢使用本地节点的功能。任何人都可以对此有所了解?

[编辑]

其实监视实际日志文件工作没有任何问题,即使在日志文件中得到了旋转。问题实际上是由符号链接引起的。我监视符号链接的原因是因为实际的日志文件名称在大小达到一定限制时发生更改。 /var/log/lighttpd/error.log只是一个例子。我无法控制日志文件的重命名方式,但我确实有一个crontab,它会更新每分钟更新符号链接的符号链接。

[编辑2012/2/28]

其实我使用下面的方法(通过卵)

tail -F ./symlink_to_error.log 
在日志监控项目

是我的工作,因为它的工作原理相当尽管它不像watchFile()那样有效,但它仍然可靠。

回答

0

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

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. 
    } 
}); 
+0

感谢回答maerics,但它似乎并没有工作。我也尝试改变从软的符号链接(应该在我的问题中指出),以努力(因为在你的解决方案中,你正在比较硬链接的数量)。我正在考虑2个计划B: 1)按照预定的时间间隔在symlink上调用fs.readlink,并在其回调中观察真实文件 2)在节点进程中设置用户信号(例如SIGUSR1)陷阱并使外部进程,用于更新符号链接更改时发出的符号链接触发信号。当节点进程获取该信号时,再次运行fs.readlink以反映更改。 – ricochen 2012-02-22 00:28:05