в Java, как получить имя файла в потоке

#java #logging

#java — язык #ведение журнала #java

Вопрос:

У меня есть ArrayList вызванный fileList . Он содержит список имен файлов. С помощью цикла for я создаю поток для каждого имени файла и отслеживаю файл с помощью TailListener Java API. Теперь я хочу получить имя файла для каждого сообщения, присутствующего в файлах.

 fileListener= new fileListener();

for(int i=0;i<fileList.Size();i  )
{           
   monitorFile(filelist.get(i));            
}

private void monitorFile(String logFile) {

         File pcounter_log = new File(logFile);

         Tailer = new Tailer(pcounter_log, fileListener, 5000);   

         ThreadPoolExec.scheduleAtFixedRate(Tailer, 5, 5, TimeUnit.SECONDS);    
    }


public class fileListener extends TailerListenerAdapter {

String s= "abc";

    public void handle(String line) {

            if(line.contains(s)){
                System.out.println(line);
            }
    }
}
  

В приведенном выше коде, как мне получить имя файла для соответствующих сообщений журнала?

Комментарии:

1. Какие соответствующие сообщения журнала? Боюсь, ваш вопрос далек от ясности. Пожалуйста, прочитайте tinyurl.com/so-hints и отредактируйте свой вопрос, чтобы предоставить больше информации.

Ответ №1:

Одним из простых способов было бы использовать отдельные прослушиватели для каждого файла:

Измените свой fileListener класс на что-то вроде этого:

 public class FileListener extends TailerListenerAdapter {

    private final String fileName;

    public FileListener(String fileName) {
         this.fileName = fileName;
    }

    public void handle(String line) {
         if(line.contains(s)){
             System.out.println(fileName   ": "   line);
         }
    }
}
  

Затем просто создайте новый экземпляр FileListener для каждого файла, который вы отслеживаете:

 private void monitorFile(String logFile) {
     File pcounter_log = new File(logFile);
     Tailer = new Tailer(pcounter_log, new FileListener(logFile), 5000);   
     ThreadPoolExec.scheduleAtFixedRate(Tailer, 5, 5, TimeUnit.SECONDS);    
}