在Java中,追踪/轮询日志文件的最有效方法是什么?

4
有许多方法可以创建一个程序并调用Unix的tail命令,但这种方法的问题在于必须在安装有tail的Unix机器上运行进程。
另一种选择是逐行读取文件,直到没有更多行,等待一段时间,然后尝试读取下一行并重复此过程。
问题是如何轮询正在被写入的文件。据我所知,在Java中没有办法获得异步通知文件已被修改,因为这太低级了(这是来自操作系统的内容)。我也不知道有哪些库支持这个功能。
我想一个更好的方法可能是在文件的修改日期上进行睡眠/轮询..?
有解决方案吗?
4个回答

5
如果您能使用Java 7,就可以使用文件监控器实现所需功能。如果您想了解更多内容,可参考文件通知教程。
如果您使用的是Java 6或早期版本,则需要使用Apache Commons VFS (文件监视器)库来创建自己的文件监控器。
如果您无法使用Java 7或第三方库(例如常用的jnotify),则必须使用轮询线程编写自己的文件监视器。

我怀疑文件通知仅用于添加和删除条目。虽然有ENTRY_MODIFY,但我认为它只是针对目录条目而非文件长度的更改。 - Peter Lawrey

3

Java 7,在这种情况下不能使用,但是建议不错。 - NightWolf

1
你可以做的是创建一个线程去轮询文件的大小,并只读取相应大小的数据,这样就不会读到文件的结尾。这些读取的数据可以写入一个管道,使得主线程可以从管道中连续地读取数据。

0

我不知道答案。只能给你两个提示:
1. 或许RandomAccessFile可以帮到你。
2. 尝试找另一个开源程序,它可以做到这一点。(例如IntelliJ IDEA正好可以做到这一点)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接