Как я могу следить за файлом типа "Tail -f" на Java, не открывая файл (запретить переименование/удаление)
Мне хотелось бы "Tail -f" много лог файлов из java-приложения.
Я получил это, чтобы отслеживать размер и последнее обновление и многократно открывать файл и считывать последние несколько байтов всякий раз, когда изменяется размер файла или последнее время обновления, а затем сразу же закрывается.
Это кажется проблематичным, потому что я могу открыть его, когда регистратор решает переименовать файл, который вызовет какую-то проблему.
Я также хотел бы обнаружить файл "Rolled" с более надежным механизмом, чем заметить, что размер файла уменьшен... кажется, склонный к ошибкам, но маловероятный.
Поскольку у меня нет доступа к файловому дескриптору или другим низкоуровневым файловым утилитам, я не могу воспроизвести поведение хвоста, но есть ли какие-либо трюки для чтения файла без "блокировки" его для переименования /delete (Windows 7)
Я предполагаю, что другая возможность состоит в том, чтобы фактически запустить процесс tail -f и прочитать выход процесса, но это кажется несколько тяжелым - я сканирую, как 60 лог файлов здесь, некоторые из которых имеют много выходных данных (большинство из них будут холостой ход).
Ответы
Ответ 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