【问题标题】:Log monitor problem with Java and org.apache.commons.io.input.TailerJava 和 org.apache.commons.io.input.Tailer 的日志监视器问题
【发布时间】:2011-01-25 18:30:32
【问题描述】:

我正在尝试使用它来监视日志文件并将日志行放入数据库中。我遇到的问题是,当包含我的 TailerListener 的线程正在运行时,我无法删除或重命名日志文件。在这种情况下,我不确定当日志文件翻转时会如何反应,这会在夜间发生。我看了一眼 Tailer 的代码,它似乎可以处理日志翻转,但是我看不到被监视的文件何时基本被锁定。

应该没有理由不能删除该文件,因为我只是从中读取。我认为一旦文件被删除/重命名,它只会抛出某种类型的异常。特别是因为 Tailer 似乎是针对“tail -f”的功能而编写的。

我在尝试删除文件时遇到的确切错误:“此操作无法完成,因为该文件已在 Java(TM) Platform SE 二进制文件中打开”

这是我项目中的示例代码:


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

    try {
        TailerListener listener = new PCTailListener();
        Tailer tailer = new Tailer(pcounter_log, listener, 5000);

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


public class PCTailListener extends TailerListenerAdapter {
 public void handle(String line) {
  System.out.println(line);
 }
}

非常感谢任何关于 Tailer 的信息,特别是 Java 中的文件处理,任何可能让我走上正轨的信息。

【问题讨论】:

    标签: java file logging monitor


    【解决方案1】:

    如果某个进程正在使用该文件,您不能删除/重命名它,但可以读取它。您可以做的是复制文件并在复制的文件中执行所有操作。

    为什么不能修改?因为可能有一个打开的流锁定了文件。

    【讨论】:

    • 是的,我明白这一点。如果您查看接口方法,我的困惑来自这样一个事实,即这个库是在考虑到这一点的情况下构建的:commons.apache.org/io/api-release/org/apache/commons/io/input/…
    • 你说得对,接口描述了文件更改或“旋转”时的异常处理。也许其他一些进程/线程正在处理该文件?
    • 但是检查代码,Tailer 类包含对文件的引用,它只处理异常。没有部分表明文件没有保持锁定状态。
    • 我知道发生了什么。文件轮换的工作方式是不重命名目标文件,并在其位置创建一个新文件。相反,当所有数据都被删除并且其长度小于文件中的当前位置时,文件被“旋转”。现在我只需要确保我正在监视的应用程序正确或天真地轮换日志文件。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多