Пример 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, но безуспешно. Что я здесь делаю неправильно?


person user2435860    schedule 10.04.2014    source источник
comment
while(true) {} никогда не бывает хорошей идеей. Вы запускаете MyListener в отдельном потоке? Вы должны по крайней мере добавить Thread.sleep(...) в свой цикл.   -  person SebastianH    schedule 10.04.2014
comment
Я не уверен, почему вы получили отрицательный голос. Кажется ясным вопрос с кодом, который демонстрирует проблему.   -  person Duncan Jones    schedule 10.04.2014
comment
не могли бы вы оценить это? Я попытался прояснить ситуацию, раскрыть проблему и показать пример своего кода. Я уважал условия stackoverflow   -  person user2435860    schedule 10.04.2014


Ответы (2)


Основываясь на моем тестировании, Tailer будет печатать строку только тогда, когда вы добавили новую строку в файл. Так что попробуй sudo echo "Hello\n" >> log.txt

Также обратите внимание, что если вы вызываете create, вы запускаете поток, но не имеете его дескриптора. Следовательно, почему у вас должен был быть цикл while/true.

Вместо этого вы можете попробовать это:

public static void main(String[] args) {
    TailerListener listener = new MyListener();
    Tailer tailer = new Tailer(new File("log.txt"), listener, 500);        
    tailer.run();
}
person Duncan Jones    schedule 10.04.2014
comment
Итак, я сделал то, что вы сказали, и это работает. Одна вещь, однако, я печатаю вывод дважды. например, если я попытаюсь написать в терминале echo Hello ›› log.txt, он дважды напечатает Hello в консоли. Это почему? - person user2435860; 10.04.2014
comment
@user2435860 user2435860 Я предполагаю, что это потому, что у вас все еще есть Tailer tailer = Tailer.create, а не Tailer tailer = new Tailer? Эта ошибка приведет к тому, что у вас будут запущены два потока, каждый из которых будет печатать на стандартный вывод. - person Duncan Jones; 10.04.2014
comment
Большое спасибо, это решило мою проблему. Я думал, что использование create — единственный способ создать новый экземпляр. У меня было ощущение, что конструктор не является общедоступным, поэтому я использовал метод Factory, используя create. Теперь он работает отлично. Теперь я могу перейти к следующему шагу — парсингу. Большое спасибо! Ваше здоровье! - person user2435860; 10.04.2014

Ваш код должен работать. Для меня это работает так, как ожидалось.

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);
        }

    }
}
person Community    schedule 10.04.2014
comment
Мне удалось заставить его работать, теперь моя проблема в том, что он печатает каждую строку дважды, как я могу это решить? - person user2435860; 10.04.2014