别小看tail 命令,它难倒了大神

tail命令能够看到日志的滚动,非常方便。于是xjjdog想,既然我们能够用这个命令,看到所有的日志,那能不能使用tail命令,做日志收集呢?

想象归想象,如果你想要一个快速的实时日志收集工具,那tail确实是个非常棒的工具。它比什么flume、logstatsh,比什么filebeat之类的,快捷的多。事实上,在工具缺乏的旧年代,我就曾经这么干过,而且它工作的很好。

下面是一段使用Java语言书写的代码。我们可以按行读取日志,然后使用自己喜欢的语言,做任何事情。


  1. import java.io.BufferedReader; 
  2. import java.io.InputStreamReader; 
  3.  
  4. public class TailReader { 
  5.     public static void main(String[] args) throws Exception { 
  6.         ProcessBuilder ps = new ProcessBuilder("tail""-f""/tmp/tail0"); 
  7.         //把错误输出也打印 
  8.         ps.redirectErrorStream(true); 
  9.         Process process = ps.start(); 
  10.  
  11.         //持续读取tail的输出 
  12.         try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()))) { 
  13.             String line; 
  14.             while ((line = in.readLine()) != null) { 
  15.                 setLogToKafka(line); 
  16.                 //注意这里不要产生异常,否则会打断while循环 
  17.             } 
  18.         } 
  19.     } 
  20.  
  21.     //模拟发送到kafka,我们这里只简单的打印出来 
  22.     static void setLogToKafka(String line) { 
  23.         System.out.println(line); 
  24.     } 

主要的思想,就是使用Java的Process启动一个子tail进程,一直监控着文件的输出。然后把标准输出和标准错误流,全部定向到BufferedReader中。接下来,你能做你想要做的任何事。

这有一定的风险,假如tail命令被杀掉了,我们的Java程序就失去了作用。

程序很简单,但xjjdog在这里讨论的却不是这个简单的收集程序,而是tail命令的一些有趣的特性,你可以从中一窥一些日志收集工具对文件的特殊处理。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章