使用 Java WatchService 监视和分析日志文件



我正在尝试监视文件夹以获取特定日志文件的更新,使用Java 8中的JavaWatchService

此日志文件是使用java.util.logging.Logger创建的,并具有常规的 FileHander,该处理程序在日志文件达到特定大小后对其进行轮换。它最初创建 tracelog0.log并在日志轮换后创建 tracelog1.log。所有新条目仍转到 tracelog0.log。

我正在获得StandardWatchEventKinds.ENTRY_MODIFY事件。但问题是当日志文件轮换时,我没有收到任何事件,日志监控线程似乎被杀死了。我也添加了一个新的StandardWatchEventKinds.ENTRY_DELETE事件,但仍然不起作用。 这是我进行监控的线程。请让我知道这是否是正确的方法。请为这种情况提出任何替代解决方案。

class WatcherThread implements Runnable {
public static final String WORKING_DIRECTORY = "/var/log/data/";
Path logDir = Paths.get(WORKING_DIRECTORY);
WatchEvent.Kind<?> [] kinds = { StandardWatchEventKinds.ENTRY_CREATE, 
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY};
boolean runThread = true;
private WatchService watcher;
private boolean logRotated = false;
public WatcherThread(){
try {
watcher = logDir.getFileSystem().newWatchService();
logDir.register(watcher, kinds);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while(runThread) {
// Get next event or wait if none are yet present
try {
WatchKey key = watcher.take();
for (WatchEvent<?> event : key.pollEvents()) {
// Retrieve event kind
WatchEvent.Kind<?> kind = event.kind();
if (StandardWatchEventKinds.OVERFLOW == kind) {
continue;
}else {
WatchEvent<Path> ev = (WatchEvent<Path>)event;
Path filename = ev.context();
Path child = logDir.resolve(filename);
System.out.println("New file created Filename: "+child.getFileName());
if(child.getFileName().startsWith("tracelog")) {
System.out.println("tracelog file rotated.");
//Possible tracelog0.log file is rotated. 
logRotated = true;
}
}
}
boolean isValid = key.reset();
if(!isValid) {
System.out.println("Unable to reset the Key exiting!!!");
runThread = false;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public boolean isLogRotated() {
return logRotated;
}
}

我想我已经解决了这个问题。该问题是由于java.util.Logger框架引起的。当日志文件轮换发生时,它不会删除实际的日志记录文件。

当前日志由记录器存储在缓存中。当需要根据日志大小轮换日志文件时。它会创建一个新文件并将内容复制到新文件中。

Example 
When the server starts the below files get created 
/var/log/data/tracelog0.log 
/var/log/data/tracelog0.log.lck
when log file rotates it creates a new file tracelog1.log
/var/log/data/tracelog0.log 
/var/log/data/tracelog0.log.lck
/var/log/data/tracelog1.log

因此,仅触发 MODIFY 和 CREATE 事件。不会触发 DELETE 事件。

我认为这可能会因我们使用的记录器而异。最好查看记录器如何旋转日志文件。

相关内容

  • 没有找到相关文章

最新更新