繁体   English   中英

在Java taillistener中,如何处理更多日志文件

[英]in java taillistener, how to handle more log files

我正在使用Java taillistener监视我的日志文件。每当更新日志文件时,它将打印日志消息。当启动一个或两个日志文件时,它可以正常工作。但是当尝试监视更多文件(例如10个文件)时,有即使在日志文件中更新了日志,控制台上也没有显示任何消息。我的代码如下。

ScheduledThreadPoolExecutor logMonitorThreadPoolExec;

if (listOfFiles[i].isFile()) 
{
 files = listOfFiles[i].getName();
 File pcounter_log = new File(files);                                
 Tailer logMessages = new Tailer(pcounter_log, new FileListener(files,element.getLogPattern()),
                                        5000, true);
 logMonitorThreadPoolExec.scheduleWithFixedDelay(logMessages, 5, 20,
                        TimeUnit.SECONDS);

}

public class FileListener extends TailerListenerAdapter {

 private final String fileName;

 public FileListener(String fileName, ArrayList<String> pattern) {
    this.fileName = fileName;
 }
  public void handle(String line) {

    System.out.println(fileName+"<---->"+line); 
    }
}

你能帮我解决这个问题吗?

我认为问题在于您使用拖尾的方式错误。

您正在尝试通过执行程序服务的线程池使用拖尾程序。 但是Tailer具有的属性是直到外部调用Tailer.stop() ,它才会从run()方法退出。 在您的代码中,这不会发生。

更糟糕的是,您正在使用ScheduledThreadPoolExecutor ,并告诉它每20秒启动一个新的Tailer线程!

因此,将会发生的事情是,排定的前N个Tailer运行将各自抓住执行者服务的一个线程...并永远挂在其上。 当所有线程都在使用中时,执行器将等待其中一个线程完成...而这不会发生。

解决方案是在自己的专用线程中运行每个Tailer实例。 您不应该尝试使用有限线程池中的线程,因为您将耗尽该池。 而且出于相同的原因,您不应该尝试使用执行程序服务。


如果使用专用线程不起作用,那我就没主意了。 您需要自己看一下Tailer代码和/或在调试器下运行您的应用程序,以便可以看到Tailer线程实际在做什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM