2010-09-28 123 views
0

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

目标平台是一个Ubuntu服务器,64位。

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

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

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

是那个常数stat()打开和关闭一个问题? tail -f怎么办?我可以保持文件打开并通过类似select()的方式通知新数据吗?或者它总是在文件结尾处返回?

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

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

回答

1

如果你想知道tail -f如何工作,为什么不看the source?简而言之,您不需要定期中断或不断stat()来扫描文件或目录的更改。这就是inotify所做的。

+0

我相信这个问题带路:http://stackoverflow.com/questions/324258/is-there-an-equivalent-to-the-net-filesystemwatcher-in-the-linux-world - 它看起来像像一个好的解决方案。 – ygoe 2010-12-23 12:43:45