成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別小看tail 命令,它難倒了技術總監(jiān)

系統 Linux
tail命令能夠看到日志的滾動,非常方便。于是xjjdog想,既然我們能夠用這個命令,看到所有的日志,那能不能使用tail命令,做日志收集呢?

[[350507]]

 本文轉載自微信公眾號「小姐姐味道」,作者小姐姐養(yǎng)的狗 。轉載本文請聯系小姐姐味道公眾號。 

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.         //持續(xù)讀取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循環(huán) 
  17.             } 
  18.         } 
  19.     } 
  20.  
  21.     //模擬發(fā)送到kafka,我們這里只簡單的打印出來 
  22.     static void setLogToKafka(String line) { 
  23.         System.out.println(line); 
  24.     } 

主要的思想,就是使用Java的Process啟動一個子tail進程,一直監(jiān)控著文件的輸出。然后把標準輸出和標準錯誤流,全部定向到BufferedReader中。接下來,你能做你想要做的任何事。

這有一定的風險,假如tail命令被殺掉了,我們的Java程序就失去了作用。

程序很簡單,但xjjdog在這里討論的卻不是這個簡單的收集程序,而是tail命令的一些有趣的特性,你可以從中一窺一些日志收集工具對文件的特殊處理。

你知道tail -f和tail -F的區(qū)別么?

在回答這個問題之前,我們先回憶一下,Java常用的日志框架,對日志的處理。

 

  1. <configuration> 
  2.   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"
  3.     <!-- Support multiple-JVM writing to the same log file --> 
  4.     <prudent>true</prudent> 
  5.     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
  6.       <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> 
  7.       <maxHistory>30</maxHistory>  
  8.       <totalSizeCap>3GB</totalSizeCap> 
  9.     </rollingPolicy> 
  10.  
  11.     <encoder> 
  12.       <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
  13.     </encoder> 
  14.   </appender>  
  15.  
  16.   <root level="DEBUG"
  17.     <appender-ref ref="FILE" /> 
  18.   </root> 
  19. </configuration> 

上面的配置,將在每晚凌晨的時候,滾動形成一個新的文件。

那這個滾動,是如何做的呢?我們可以收工模擬這個過程。

  1. mv run.log run.2020-11-02.log 
  2. touch run.log 

測試一下

文件滾動,會生成新的文件,那tail命令還能跟蹤到么?

我們來測試一下。

第一步,創(chuàng)建要監(jiān)控的文件

  1. touch /tmp/tail0 

第二步,啟動我們的Java代碼

第三步,生成一個不間斷的流

  1. watch -n 1  'echo `date` >> /tmp/tail0 ' 

上面的命令每隔1秒鐘,往我們的文件中打印一下當前的日期,可以看到Java端已經收到了這些數據。

第四步,模擬文件滾動

  1. mv /tmp/tail0 /tmp/tail.bak 
  2. touch /tmp/tail0 

此時,我們可以看到,Java端此時已經接受不到數據了。

Why?

為了看到這是為什么,我們使用兩個命令來看一下進程的一些狀態(tài)。

首先,使用ps命令,查看當前的tail進程。

  1. ps -ef|grep tail 
  2.   501 21374 21373   0  1:51PM ??         0:00.01 tail -f /tmp/tail0 

這正是我們的命令。

我們使用lsof命令去查看這個進程所關聯的文件。

  1. lsof -p 21374 | awk '{print $4 "\t"  $9}' 
  2. FD NAME 
  3. cwd /tmp/ 
  4. txt /usr/bin/tail 
  5. txt /usr/lib/dyld 
  6. 3r /private/tmp/tail.bak 

我們看到tail進程所監(jiān)控的文件,其實是tail.bak文件,已經和tail命令沒什么關系了。

我們嘗試像tail.bak輸入一點內容。

  1. echo "haha: xjjdog, i am from tail.bak" >> /tmp/tail.bak 

此時如我們所愿,Java進程有反應了,正常輸出了這句話。

怎么辦?

就如同我們問題中問的一樣,把tail -f換成tail -F就可以了。

tail -f的意思是,根據文件描述符進行追蹤。

tail -F的意思是,根據文件名進行追蹤,它會有重試的動作。

所以,我們的日志收集程序,毫無疑問是根據日志名稱追蹤的,應該把f改成F。

End

既然知道了這些小區(qū)別,我們就對日常工作中遇到的一些靈異問題有了解釋。

大家都知道rm命令,能夠刪除一個文件。如果有這個文件,正在被其他進程所使用,那這些文件你看起來像是刪掉了,但它的內容卻不釋放。

  1. lsof | grep deleted 

上面這個命令,能夠看到這些失控的文件。一般你kill掉相應的進程,這些句柄也就釋放了。但你刪除這些文件的本意,就是為了避免重啟應用,這可真讓人糾結。

  1. cat /dev/null > logpath 

所以我們在刪除文件的時候,一般不會使用rm,而應該使用重定向符號。將萬物皆空的/dev/null,發(fā)向它們。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

 

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2021-01-15 08:00:31

日志技術Log4j

2021-01-07 08:23:02

日志

2021-07-29 06:28:13

網絡網工網絡中斷

2023-09-20 08:03:32

JavaScript編程語言

2019-09-01 23:28:50

命令行Linux系統性能監(jiān)控

2020-02-25 22:52:42

工具代碼開發(fā)

2016-12-19 13:18:19

思科

2022-08-28 16:20:44

模型數學

2025-04-27 04:02:00

機器學習模型網絡

2022-09-07 07:08:28

架構應用場景數據流

2020-02-25 17:03:29

技術研發(fā)指標

2009-04-05 10:26:47

2023-03-24 10:07:46

tail命令

2024-06-11 08:17:00

2013-11-14 09:58:23

紅帽redhat

2021-08-20 10:41:47

開發(fā)工具代碼

2020-09-01 09:31:38

程序員技能開發(fā)者

2009-05-26 16:43:41

虛擬化CIOIT

2020-02-13 08:08:23

禁止使用Lombok

2020-02-12 14:03:25

實用Java工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人精品一区 | 亚洲成a | 午夜在线观看视频 | 亚洲一区中文字幕在线观看 | 国产农村一级片 | 亚洲一区二区三区免费在线观看 | 欧美一级视频 | 亚洲国产精品视频一区 | 午夜丰满寂寞少妇精品 | 欧美日韩久久 | 久久影音先锋 | 九九av| 欧美精品久久久久久久久老牛影院 | 美女啪啪国产 | 久久99深爱久久99精品 | 精品网站999| 日韩一级不卡 | 久久久久亚洲精品国产 | 日韩成人免费视频 | 成人av鲁丝片一区二区小说 | av在线三级| 日日艹夜夜艹 | 国产精品日产欧美久久久久 | 久草综合在线视频 | 99国产精品久久久久老师 | 免费视频二区 | 天天爱爱网 | 欧美视频在线播放 | 国产精品无码专区在线观看 | 综合久久久久久久 | 特级一级黄色片 | 久久久久久久网 | 亚洲午夜小视频 | 日韩欧美高清 | 亚洲高清免费观看 | 无码日韩精品一区二区免费 | 国产一区二区欧美 | 在线成人免费视频 | 日日日日日日bbbbb视频 | 亚洲精品一区二区三区蜜桃久 | 午夜影视网 |