Как я могу следить за файлом типа "Tail -f" на Java, не открывая файл (запретить переименование/удаление) - программирование
Подтвердить что ты не робот

Как я могу следить за файлом типа "Tail -f" на Java, не открывая файл (запретить переименование/удаление)

Мне хотелось бы "Tail -f" много лог файлов из java-приложения.

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

Это кажется проблематичным, потому что я могу открыть его, когда регистратор решает переименовать файл, который вызовет какую-то проблему.

Я также хотел бы обнаружить файл "Rolled" с более надежным механизмом, чем заметить, что размер файла уменьшен... кажется, склонный к ошибкам, но маловероятный.

Поскольку у меня нет доступа к файловому дескриптору или другим низкоуровневым файловым утилитам, я не могу воспроизвести поведение хвоста, но есть ли какие-либо трюки для чтения файла без "блокировки" его для переименования /delete (Windows 7)

Я предполагаю, что другая возможность состоит в том, чтобы фактически запустить процесс tail -f и прочитать выход процесса, но это кажется несколько тяжелым - я сканирую, как 60 лог файлов здесь, некоторые из которых имеют много выходных данных (большинство из них будут холостой ход).

4b9b3361

Ответ 1

Apache Commons имеет класс Tailer, будет делать то, что вы хотите? Если бы это было так, у него был механизм обнаружения прокачки, а также материал для чтения, поэтому вы получили бы все, что вам нужно.

Если это не удастся сделать, возможно, нет никакого способа сделать это с чистой java. Вам понадобится помощь, например, C-кода, используя fopen с параметром SH_DENYNO, позволяющим совместно открывать окна. Или просто вызовите реализацию хвоста выполнение системной команды.

Но поскольку код, открывающий файл журнала, является тем, который вызывает блокировку, даже это может не помочь. В этом случае единственным реальным вариантом является изменение способа ведения журнала, поскольку это является виновником блокировки файла. Log4j может использовать, помимо прочего, SocketAppender.

Ответ 2

Использовать apache.commons.io

И вот простой пример

public class LogTailTest {

/**
* TailerListener implementation.
*/
static public class ShowLinesListener extends TailerListenerAdapter {
    @Override
    public void handle(String line) {
        System.out.println(line);
    }
}

public static void main(String args[]) {

    TailerListener listener  = new ShowLinesListener();
    File file = new File("./test.log");

    Tailer tailer = new Tailer(file, listener, 1000);
    tailer.run();

    try {
        Thread.sleep(100000);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }

    tailer.stop();
}

}

Ответ 3

В Linux у вас не возникнет проблемы, так как блокировка только advisory. Но в Windows все по-другому.
Это должно зависеть от режима, в котором ваш регистратор (я полагаю, log4j) открывает файл для регистрации.
В этом ответе для C# кажется, что существует параметр dwShareMode, который можно использовать для такого рода совместного использования.

Я считаю, что NIO - это путь. Посмотрите, доступен ли параметр dwShareMode как часть NIO API