有效地跟踪多个日志文件

时间:2010-09-28 19:57:08

标签: database linux logging

我打算创建一个程序,该程序可以永久地跟踪大型动态日志文件集,将其条目复制到数据库,以便于实时统计。日志文件由不同的守护进程和应用程序编写,但它们的格式是已知的,因此可以对它们进行解析。一些守护进程每天将日志写入一个文件,例如Apache的cronolog,它创建了access.20100928等文件。这些文件会在每个新的一天出现,并且可能会在第二天被删除时消失。

目标平台是64位的Ubuntu服务器。

有效阅读这些日志文件的最佳方法是什么?

我可以想到像PHP这样的脚本语言,它们可以自己打开文件并读取新数据,也可以使用像tail -f这样的系统工具来跟踪日志,或者像Mono这样的其他运行时。 Bash shell脚本可能不太适合解析日志行并将它们插入数据库服务器(MySQL),更不用说我的应用程序的简单配置了。

如果我的程序将读取日志文件,我认为它应该在一秒左右的时间内对文件进行stat()以获得其大小并在文件增长时打开文件。在读取文件(希望只返回完整的行)之后,它可以调用tell()来获取当前位置,下次直接搜索()到保存的位置继续读取。 (这些是C函数名,但实际上我不想在C中这样做。而Mono / .NET或PHP也提供类似的功能。)

这是文件的常量stat()和随后的打开和关闭问题吗? tail -f将如何做到这一点?我可以保持文件打开并通过select()等方式通知新数据吗?或者它总是在文件的末尾返回?

如果我在某种select()或外部尾部被阻止,我需要每隔1,2分钟中断一次,以扫描应该(不再)遵循的新文件或已删除的文件。用tail -f恢复然后可能不是很可靠。这应该可以更好地保存我自己保存的文件位置。

我可以使用某种inotify(文件系统通知)吗?

1 个答案:

答案 0 :(得分:1)

如果您想了解tail -f的工作原理,为什么不关注the source?简而言之,您不需要定期中断或不断地使用stat()来扫描文件或目录的更改。这就是inotify的作用。