Apache Commons IO Tailer示例

17

我正在开发一个监控程序,它读取/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类的具体使用示例,但没有运气。我在这里做错了什么?


while(true) {} 这种写法从来都不是一个好主意。你在单独的线程中启动了 MyListener 吗?你至少应该在循环中添加 Thread.sleep(...) - SebastianH
我不确定为什么你会被踩。这是一个清晰的问题,并且提供了演示问题的代码。 - Duncan Jones
请问您能否给我评个分?我尽力让问题清晰明了,展示了我的问题,并提供了代码示例。我遵守了stackoverflow的规定。 - user2435860
2个回答

20
根据我的测试,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();
}

2
好的,我按照你说的做了,现在它可以工作了。不过有一件事,它会输出两次。例如,如果我在终端中输入 echo "Hello" >> log.txt,它会在控制台中打印出两次“Hello”。这是为什么呢? - user2435860
5
我猜那是因为你仍在使用Tailer.create而不是new Tailer,这个错误会导致两个线程同时运行并打印到stdout。 - Duncan Jones
非常感谢,这解决了我的问题。我以为只有使用create才能创建一个新的实例。我觉得构造函数不是公共的,所以我使用了工厂方法来创建。现在它完美地运行了。现在我可以继续下一步,也就是解析。非常感谢!祝你好运! - user2435860

1

你的代码应该能够正常工作。对我来说,这确实按预期工作。

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

    }
}

1
我已经成功让它工作了,我的问题现在是它会打印每一行两次,我该如何解决? - user2435860

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接