tail命令能够看到日志的滚动,非常方便。于是xjjdog想,既然我们能够用这个命令,看到所有的日志,那能不能使用tail命令,做日志收集呢?
想象归想象,如果你想要一个快速的实时日志收集工具,那tail确实是个非常棒的工具。它比什么flume、logstatsh,比什么filebeat之类的,快捷的多。事实上,在工具缺乏的旧年代,我就曾经这么干过,而且它工作的很好。
下面是一段使用Java语言书写的代码。我们可以按行读取日志,然后使用自己喜欢的语言,做任何事情。
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- public class TailReader {
- public static void main(String[] args) throws Exception {
- ProcessBuilder ps = new ProcessBuilder("tail", "-f", "/tmp/tail0");
- //把错误输出也打印
- ps.redirectErrorStream(true);
- Process process = ps.start();
- //持续读取tail的输出
- try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
- String line;
- while ((line = in.readLine()) != null) {
- setLogToKafka(line);
- //注意这里不要产生异常,否则会打断while循环
- }
- }
- }
- //模拟发送到kafka,我们这里只简单的打印出来
- static void setLogToKafka(String line) {
- System.out.println(line);
- }
- }
主要的思想,就是使用Java的Process启动一个子tail进程,一直监控着文件的输出。然后把标准输出和标准错误流,全部定向到BufferedReader中。接下来,你能做你想要做的任何事。
这有一定的风险,假如tail命令被杀掉了,我们的Java程序就失去了作用。
程序很简单,但xjjdog在这里讨论的却不是这个简单的收集程序,而是tail命令的一些有趣的特性,你可以从中一窥一些日志收集工具对文件的特殊处理。