在Java中尾随/轮询日志文件的最有效方法[重复]

Posted

技术标签:

【中文标题】在Java中尾随/轮询日志文件的最有效方法[重复]【英文标题】:Most efficient way to tail/poll a log file in Java [duplicate] 【发布时间】:2012-04-12 06:11:51 【问题描述】:

有很多方法,可以使用创建程序并调用Unix tail 命令,但是这样做的问题是该进程必须安装在安装了tail 的Unix 机器上。

另一种选择是逐行读取文件,直到没有更多行,休眠一段时间,然后尝试读取下一行并重复。

问题是我如何/如何轮询正在写入的文件。 AFAIK在文件被修改时无法在Java中获取异步通知,因为这太低级(来自操作系统的东西)。我也知道没有支持这一点的库。

我在想更好的方法可能是在文件的修改日期休眠/轮询..?

有什么解决办法吗?

【问题讨论】:

【参考方案1】:

如果您可以使用 Java 7,则有 File Watchers,您可以实现所需的功能。File Notifications

对于 Java 6(和之前的版本),您必须使用 Apache Commons VFS (File Monitor) lib 来创建您自己的文件观察器。

如果您不能使用 Java 7 或使用第三方库(例如 commons 或 jnotify),您将不得不使用轮询线程自己编写一个文件看门狗。

【讨论】:

我怀疑文件通知仅用于添加和删除条目。有一个 ENTRY_MODIFY 但我认为它只是更改了目录条目而不是文件长度。【参考方案2】:

如果文件/目录发生更改,您可以使用java nio's WatchService 获取异步通知。这个tutorial 解释了它的使用方法。

【讨论】:

Java 7,在这种情况下不能使用它,但很好的建议。【参考方案3】:

您可以做些什么来简化这一点,即创建一个线程来轮询文件的大小并且只读取那么多,即它永远不会到达结尾。读取的数据可以写入管道,使您的主线程可以读取连续管道。

【讨论】:

【参考方案4】:

我不知道答案。只有两个提示 1. 也许 RandomAccessFile 会帮助你。 2. 尝试找到另一个开源程序,它可以做到这一点。 (例如,IntelliJ IDEA 就是这样做的)

【讨论】:

以上是关于在Java中尾随/轮询日志文件的最有效方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

避免在printf()中尾随零

这个 numpy 赋值中尾随逗号的作用是啥?

使用 Node 轮询 Amazon SQS 队列的最有效方法

在Windows上检查Java中文件是否为空的最有效方法

在Java中检测偶数的最有效方法是什么? [重复]

Java中循环局部变量初始化的最有效方法是啥? [复制]