Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和org.apache.commons.io.input.Tailer的日志监视器问题_Java_File_Logging_Monitor - Fatal编程技术网

Java和org.apache.commons.io.input.Tailer的日志监视器问题

Java和org.apache.commons.io.input.Tailer的日志监视器问题,java,file,logging,monitor,Java,File,Logging,Monitor,我试图使用它来监视日志文件,并在日志行进入时将其放入数据库。我遇到的问题是,似乎在包含我的TailerListener的线程运行时,我无法删除或重命名日志文件。在这种情况下,我不确定当日志文件滚动时会有什么反应,这种情况每晚都会发生。我浏览了一下Tailer的代码,它似乎可以处理日志滚动,但我看不出被监视的文件基本上是如何被锁定的 没有理由不能删除该文件,因为我只是从中读取。我认为一旦文件被删除/重命名,它就会抛出某种类型的异常。特别是因为Tailer似乎是针对“tail-f”的功能编写的 我在

我试图使用它来监视日志文件,并在日志行进入时将其放入数据库。我遇到的问题是,似乎在包含我的TailerListener的线程运行时,我无法删除或重命名日志文件。在这种情况下,我不确定当日志文件滚动时会有什么反应,这种情况每晚都会发生。我浏览了一下Tailer的代码,它似乎可以处理日志滚动,但我看不出被监视的文件基本上是如何被锁定的

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

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

以下是我的项目中的示例代码:


公共类PCTailListener扩展了TailrListenerAdapter{
公共无效句柄(字符串行){
系统输出打印项次(行);
}
}


非常感谢您提供有关Tailer的任何信息,特别是Java中的文件处理,以及任何可能使我走上正轨的信息。

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


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

是的,我明白。我的困惑来自于这样一个事实:如果你看一下接口方法,这个库就是在考虑到这一点的情况下构建的:没错,接口描述了文件更改或“旋转”时的异常处理。也许其他进程/线程正在处理该文件?但在检查代码时,Tailer类持有对该文件的引用,它只处理异常。没有一个地方说文件没有被锁定。我知道发生了什么。文件旋转的工作方式是不重命名目标文件,而是在其位置创建一个新文件。相反,当删除所有数据且其长度小于文件中的当前位置时,文件将被“旋转”。现在,我只需要确保我监视的应用程序正确地或天真地旋转日志文件。

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);
 }
}