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

时间:2011-05-18 04:37:08

标签: java logging taillistener

我正在使用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); 
    }
}

你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我认为问题在于你错误地使用了Tailer。

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

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

所以会发生的事情是,第一个N Tailer运行计划将各自抓取一个执行程序服务的线程......并永远挂起它。当所有线程都在使用时,执行程序将等待其中一个线程完成......这不会发生。

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


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