想实现tail功能,搜了一堆代码,好复杂。 想着apache是否有现成的,一搜真有, 使用好简单啊,哈哈
package com.why;
import java.io.File; import java.nio.charset.Charset; import java.util.Timer; import java.util.TimerTask;
import org.apache.commons.io.input.Tailer; import org.apache.commons.io.input.TailerListener; import org.apache.commons.io.input.TailerListenerAdapter;
public class MyTail {
public static void main(String[] args) {
String path = "D:\\xxxx\\log\\yyyy.log";
// 监听 TailerListener listener = new TailerListenerAdapter() {
StringBuilder sb = new StringBuilder();
//每一行新内容会回调它 @Override public void handle(final String line) { sb.append(line).append("\r\n嘎"); }
//读到末尾会回调它 public void endOfFileReached() { System.out.println("---------------"); System.out.println(sb.toString()); sb.setLength(0); } };
// 创建Tailer,新线程执行 // 1000是读取间隔毫秒数 // true,从文件末尾开始,false从开头开始,会把文件内容都打印出来 // false,是否每次reOpen文件 // 4096,读文件的bufferSize final Tailer tailer = Tailer.create(new File(path), Charset.forName("UTF-8"), listener, 1000, true, false, 4096);
// 定时器,60秒后,停止tailer Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { tailer.stop(); System.out.println("tailer end"); } }, 60 * 1000); }
}
Tailer大概原理就是,查看文件大小,有变化,就从上次位置开始读取, 每行触发一次监听者的handle方法 读完触发一次监听者的endOfFileReached方法。
我这里,把每次读取内容拼起来了,打算发到服务端,方便远程tail日志。 然后跑十分钟,就自动关掉tailer。 想看再发指令过来,再开。
|