3

我的代码如下。

public static void main(String[] args) {
    // TODO code application logic here
    File pcounter_log = new File("c:\development\temp\test.log");

try {

    Tailer tailer = new Tailer(pcounter_log, new FileListener("c:\development\temp\test.log",getLogPattern()), 5000,true);

    Thread thread = new Thread(tailer);
    thread.start();
} catch (Exception e) {
    System.out.println(e);
}
}

public class FileListener extends TailerListenerAdapter {


 public void handle(String line) {
        for (String logPattern : pattern) {
            if (line.contains(logPattern)) {
                logger.info(line);

            }
        }
    }
}

这里getLogPattern()返回一个ArrayList包含值,如 [info,error,abc.catch,warning]。运行此代码时,我收到旧日志消息,然后是新日志消息。即输出是这样的:

20 May 2011 07:06:02,305  INFO FileListener:? - 20 May 2011 07:06:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:06:55,052  INFO FileListener:? - 20 May 2011 07:06:55,016 DEBUG  - readScriptErrorStream()
20 May 2011 07:06:56,056  INFO FileListener:? - 20 May 2011 07:06:55,040 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:07:01,241  INFO FileListener:? - 20 May 2011 07:07:01,219 DEBUG  - readScriptErrorStream()
20 May 2011 07:07:02,245  INFO FileListener:? -  20 May 2011 07:07:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:07:55,020  INFO FileListener:? -  20 May 2011 07:07:55,016 DEBUG  - readScriptErrorStream()
20 May 2011 07:07:56,024  INFO FileListener:? - 20  2011 07:07:55,030 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:01,269  INFO FileListener:? -  20 May 2011 07:08:01,227 DEBUG - readScriptErrorStream()
20 May 2011 07:08:02,273  INFO FileListener:? -  20 May 2011 07:08:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:21,234  INFO FileListener:? -  20 May 2011 06:40:02,461 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:22,237  INFO FileListener:? -  20 May 2011 06:40:02,468 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:23,242  INFO FileListener:? -  20 May 2011 06:41:01,224 DEBUG - readScriptErrorStream()
20 May 2011 07:08:24,250  INFO FileListener:? -  20 May 2011 06:41:01,232 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:25,261  INFO FileListener:? -  20 May 2011 06:42:01,218 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:26,265  INFO FileListener:? -  20 May 2011 06:42:01,230 DEBUG   - exiting readScriptErrorStream()
20 May 2011 07:08:27,272  INFO FileListener:? -  20 May 2011 06:43:01,223 DEBUG  - readScriptErrorStream()
20 May 2011 07:08:28,275  INFO FileListener:? -  20 May 2011 06:43:01,231 DEBUG   - exiting readScriptErrorStream()

如何避免从这样的日志文件中获取旧的日志消息?

4

3 回答 3

1

哦,男孩,我已经浪费了一整天的时间,以为这是我的狡猾线程,但我现在看到其他人也分享了我的痛苦。哦,好吧,至少我不会再浪费一天时间看它了。

但我确实看过源代码。我确定 Tailer.java 文件中发生了错误:

boolean newer = FileUtils.isFileNewer(file, last); // IO-279, must be done first
...
...
else if (newer) {
    /*
    * This can happen if the file is truncated or overwritten with the 
    * exact same length of information. In cases like this, the file
    * position needs to be reset
    */
    position = 0;
    reader.seek(position);
...

文件修改数据似乎有可能在数据写入之前发生变化。我不是专家,为什么会这样。我正在从网络获取我的日志文件,因此可能正在进行各种缓存,这意味着您无法保证更新的文件将包含更多数据。

我已更新源并删除了此部分。对我来说,以完全相同的字节数截断/重新创建文件的可能性很小。我正在引用 10MB 滚动日志文件。

我看到这是一个已知问题(IO-279 LINK HERE)。但是,它被标记为已解决,显然情况并非如此。我会联系开发人员,看看是否有什么东西正在筹备中。看来他们对修复的看法与我相同。

于 2013-01-09T18:16:37.773 回答
0

https://issues.apache.org/jira/browse/IO-279?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

你使用的是什么版本的 commons.io?我在 2.0.1 中遇到了这个错误。我更新到 2.3,它似乎工作正常(到目前为止)

于 2012-06-07T13:54:23.223 回答
0

我知道这是一个非常古老的线程,但我刚刚遇到了与 Tailer 类似的问题。事实证明,Tailer 有两个线程同时读取文件。

我将其追溯到我是如何创建 Tailer 实例的。我没有使用他们的 3 个建议(静态辅助方法、执行程序或线程)之一,而是使用静态辅助方法创建了实例,然后将创建的实例馈送到 Thread 中,这似乎导致两个线程读取文件。

一旦我纠正了这个问题(通过删除对静态帮助方法的调用并仅使用重载的 Tailer 构造函数和线程之一),问题就消失了。

希望这可以帮助某人。

于 2018-03-28T21:13:08.267 回答