中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux中如何使用tail 命令

發布時間:2021-11-15 16:59:05 來源:億速云 閱讀:230 作者:小新 欄目:系統運維

這篇文章主要介紹了linux中如何使用tail 命令,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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命令的一些有趣的特性,你可以從中一窺一些日志收集工具對文件的特殊處理。

你知道tail -f和tail -F的區別么?

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

<configuration>   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">     <!-- Support multiple-JVM writing to the same log file -->     <prudent>true</prudent>     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">       <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>       <maxHistory>30</maxHistory>        <totalSizeCap>3GB</totalSizeCap>     </rollingPolicy>      <encoder>       <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>     </encoder>   </appender>     <root level="DEBUG">     <appender-ref ref="FILE" />   </root> </configuration>

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

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

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

測試一下

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

我們來測試一下。

第一步,創建要監控的文件

touch /tmp/tail0

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

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

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

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

linux中如何使用tail 命令

第四步,模擬文件滾動

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

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

Why?

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

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

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

這正是我們的命令。

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

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

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

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

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

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

怎么辦?

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

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

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

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

End

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

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

lsof | grep deleted

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

cat /dev/null > logpath

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“linux中如何使用tail 命令”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹰潭市| 诸城市| 三台县| 松原市| 徐州市| 大厂| 普定县| 建阳市| 城市| 蓬莱市| 定兴县| 固始县| 秦安县| 万荣县| 绍兴县| 通许县| 金堂县| 博罗县| 麻江县| 富源县| 峨眉山市| 湟源县| 安新县| 洛扎县| 措美县| 奎屯市| 原平市| 马关县| 衡阳市| 达日县| 内黄县| 尚义县| 封开县| 龙井市| 特克斯县| 铜川市| 寿宁县| 江城| 清镇市| 长治县| 嘉鱼县|