Я пытаюсь проследить за папкой, чтобы получать обновления для указанного c файла журнала, используя Java WatchService в Java 8.
Этот файл журнала создан с использованием java.util.logging.Logger
и имеет обычный FileHander, который поворачивает файл журнала после достижения указанного c размера. Сначала создается tracelog0.log, а после ротации журнала - tracelog1.log. Все новые записи все еще go в 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;
}
}