【问题标题】:in java taillistener, how to handle more log files在 java taillistener 中,如何处理更多的日志文件
【发布时间】:2011-05-18 15:31:30
【问题描述】:

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

你能帮我处理一下吗?

【问题讨论】:

  • 此代码无法编译。第 7 行不是有效的 Java。如果您向我们提供真正的代码 sn-ps 会有所帮助......而不是被黑客入侵的东西。
  • 这是我真正的sn-p。刚刚删除了“}”。
  • ScheduledThreadPoolExecutor logMonitorThreadPoolExec.scheduleWithFixedDelay( logMessages, 5, 20, TimeUnit.SECONDS ); 既不是有效的 Java 语句也不是有效的 Java 声明。

标签: java logging taillistener


【解决方案1】:

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

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

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

所以会发生什么,第一个 N Tailer 运行计划将每个抓住一个执行程序服务的线程......并永远挂在它上面。当所有线程都在使用时,Executor 将等待其中一个线程完成......这不会发生。

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


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

【讨论】:

  • 我也尝试过使用以下代码 .if (listOfFiles[i].isFile()) { files = listOfFiles[i].getName();文件 pcounter_log = 新文件(文件); TailerListener listener = new FileListener(files,element.getLogPattern()); Tailer tailer = new Tailer(pcounter_log, listener, 5000);线程 thread = new Thread(tailer);线程.start(); } } 但我仍然面临同样的问题
  • 您确定文件名正确吗?在启动每个tailer 之前尝试使用file.exist() 检查。
猜你喜欢
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2013-07-10
  • 2020-03-27
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多