Пример Apache Commons IO Tailer
Я работаю над программой мониторинга, которая читает файл /var/log/auth.log. Я использую класс Apache Commons IO Tailer
для чтения файла в режиме реального времени. Для начала я хотел протестировать часть чтения в реальном времени на простом файле и вручную ввести код в консольной строке. Вот мой код:
public class Main {
public static void main(String[] args) {
TailerListener listener = new MyListener();
Tailer tailer = Tailer.create(new File("log.txt"), listener, 500);
while(true) {
}
}
}
public class MyListener extends TailerListenerAdapter {
@Override
public void handle(String line) {
System.out.println(line);
}
}
И с терминала: sudo echo "Hello" >> log.txt
Проблема в том, что когда я пытаюсь вручную написать что-то в файле, оно не печатает его на консоли. Я попытался найти конкретный пример использования класса Tailer, но не повезло. Что я здесь делаю неправильно?
Ответы
Ответ 1
Основываясь на моем тестировании, Tailer
будет печатать только строку, когда вы добавили новую строку в файл. Поэтому попробуйте sudo echo "Hello\n" >> log.txt
Также обратите внимание, что если вы вызываете create
, вы начинаете поток, но на нем нет дескриптора. Следовательно, у вас должен был быть временной/истинный цикл.
Вместо этого вы можете попробовать:
public static void main(String[] args) {
TailerListener listener = new MyListener();
Tailer tailer = new Tailer(new File("log.txt"), listener, 500);
tailer.run();
}
Ответ 2
Ваш код должен работать. Для меня это работает так, как ожидалось.
package de.lhorn.stackoverflowplayground;
import java.io.File;
import org.apache.commons.io.input.Tailer;
import org.apache.commons.io.input.TailerListenerAdapter;
public class App {
private static final int SLEEP = 500;
public static void main(String[] args) throws Exception {
App app = new App();
app.run();
}
private void run() throws InterruptedException {
MyListener listener = new MyListener();
Tailer tailer = Tailer.create(new File("/tmp/log.txt"), listener, SLEEP);
while (true) {
Thread.sleep(SLEEP);
}
}
public class MyListener extends TailerListenerAdapter {
@Override
public void handle(String line) {
System.out.println(line);
}
}
}