在java taillistener中,如何处理更多日志文件
我正在使用java taillistener监控我的日志文件。每当更新日志文件时,它都会打印日志消息。当监控一个或两个日志文件时,它工作正常。但是当尝试监控更多文件(例如10个文件)时,控制台中不会显示任何消息,即使日志文件中更新了日志。我的代码如下所示 ScheduledThreadPoolExecutor logMonitorThreadPoolExec在java taillistener中,如何处理更多日志文件,java,logging,taillistener,Java,Logging,Taillistener,我正在使用java taillistener监控我的日志文件。每当更新日志文件时,它都会打印日志消息。当监控一个或两个日志文件时,它工作正常。但是当尝试监控更多文件(例如10个文件)时,控制台中不会显示任何消息,即使日志文件中更新了日志。我的代码如下所示 ScheduledThreadPoolExecutor logMonitorThreadPoolExec if (listOfFiles[i].isFile()) { files = listOfFiles[i].getName(); F
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);
}
}
if(listOfFiles[i].isFile())
{
files=listOfFiles[i].getName();
文件pcounter_log=新文件(个文件);
Tailer logMessages=new Tailer(pcounter_log,new FileListener(files,element.getLogPattern()),
5000,对);
logMonitorThreadPoolExec.scheduleWithFixedDelay(日志消息,5,20,
时间单位(秒);
}
公共类FileListener扩展了TailerListenerAdapter{
私有最终字符串文件名;
公共FileListener(字符串文件名,ArrayList模式){
this.fileName=文件名;
}
公共无效句柄(字符串行){
System.out.println(文件名+“”+行);
}
}
你能帮我处理一下吗?我想问题是你用错了零售商 您正试图使用executor服务的线程池来使用Tailer。但是一个Tailer有一个属性,它不会退出它的
run()
方法,直到外部调用Tailer.stop()
。在你的代码中,这是不会发生的
更糟糕的是,您正在使用一个
ScheduledThreadPoolExecutor
,并告诉它每20秒启动一个新的Tailer线程
因此,将要发生的是,计划的第一次NTailer
运行将分别捕获执行器服务的一个线程。。。永远坚持下去。当所有线程都在使用时,执行器将等待其中一个线程完成。。。这不会发生
解决方案是在其自己的专用线程中运行每个Tailer实例。您不应该尝试使用有限线程池中的线程,因为这样会耗尽线程池。出于基本相同的原因,您不应该尝试使用executor服务
如果使用专用线程不起作用,我就没有主意了。您需要亲自查看Tailer代码和/或在调试器下运行应用程序,以便查看Tailer线程的实际操作。我认为问题在于您使用Tailer的方式不对 您正试图使用executor服务的线程池来使用Tailer。但是一个Tailer有一个属性,它不会退出它的
run()
方法,直到外部调用Tailer.stop()
。在你的代码中,这是不会发生的
更糟糕的是,您正在使用一个
ScheduledThreadPoolExecutor
,并告诉它每20秒启动一个新的Tailer线程
因此,将要发生的是,计划的第一次NTailer
运行将分别捕获执行器服务的一个线程。。。永远坚持下去。当所有线程都在使用时,执行器将等待其中一个线程完成。。。这不会发生
解决方案是在其自己的专用线程中运行每个Tailer实例。您不应该尝试使用有限线程池中的线程,因为这样会耗尽线程池。出于基本相同的原因,您不应该尝试使用executor服务
如果使用专用线程不起作用,我就没有主意了。您需要亲自查看Tailer代码和/或在调试器下运行应用程序,以便查看Tailer线程的实际操作。此代码不会编译。第7行不是有效的Java。如果您能为我们提供真实的代码片段,这会有所帮助。。。这是我真正的代码片段。只是删除了“}”。
ScheduledThreadPoolExecutor logMonitorThreadPoolExec.scheduleWithFixedDelay(logMessages,5,20,TimeUnit.SECONDS)
既不是有效的Java语句,也不是有效的Java声明。此代码不会编译。第7行不是有效的Java。如果您能为我们提供真实的代码片段,这会有所帮助。。。这是我真正的代码片段。只是删除了“}”。ScheduledThreadPoolExecutor logMonitorThreadPoolExec.scheduleWithFixedDelay(logMessages,5,20,TimeUnit.SECONDS)代码>既不是有效的Java语句,也不是有效的Java声明。我还尝试了以下代码。if(listOfFiles[i].isFile(){files=listOfFiles[i].getName();File pcounter_log=new File(files);TailerListener=new FileListener(files,element.getLogPattern());Tailer-Tailer=new Tailer(pcounter_log,listener,5000);Thread Thread=new Thread(tailer);Thread.start();}}}但我仍然面临同样的问题。你确定文件名正确吗?在启动每个tailer之前,尝试检查file.exist()
。我也尝试了以下代码。if(listOfFiles[i].isFile(){files=listOfFiles[i].getName();文件pcounter_log=新文件(文件);TailerListener=新文件侦听器(文件,元素.getLogPattern());Tailer-Tailer=新的Tailer(pcounter_log,侦听器,5000);Thread-Thread=新线程(Tailer);Thread.start();}}但我仍然面临同样的问题。您确定文件名正确吗?在启动每个零售商之前,请尝试使用file.exist()
检查文件名。