簡體   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