Мониторинг и анализ файла журнала с использованием Java WatchService - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь проследить за папкой, чтобы получать обновления для указанного 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;
    }
}

1 Ответ

0 голосов
/ 25 января 2020

Я думаю, что понял проблему. Проблема связана с фреймворком 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 не запускается.

Я думаю, это может варьироваться в зависимости от используемого нами регистратора. Лучше посмотреть, как регистратор вращает файл журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...