根據寫入行的時間切割文件片段

根據寫入行的時間切割文件片段

我有一個始終運行的進程,日誌檔案可能達到 5 GB,有時我必須根據時間間隔截取此日誌的一部分(通常我使用 dd)。 linux中有沒有指令可以根據時間間隔取得日誌切片?

PS:此日誌中的大多數行都沒有時間戳記。

答案1

如果沒有允許您執行此操作的命令(如 Wiese 建議的那樣),為什麼不建立檔案的外部索引呢?

只是想法:您可以編寫一個永遠運行的腳本(或幾乎參見下面的註釋),並給出創建索引的時間間隔。

PIDofThisInstance=$$
# ... you code for the header, checks... 
while true  ; do
  # This is the core of your cycle
    sync   # Maybe
    CurrentSize=`ls -s $MyFile  | awk '{print $1} ' `
    CurrentTime=`date +"%Y%m%d%H%M%S"`
    echo $CurrentTime $CurrentSize >> $Log_Of_My_Log_File
    sleep $TimeToSleep
  # if (exit-condition)
  # then
  #    break           #Exit from the infinite loop.
  # fi
done 

之後,您可以執行另一個腳本,給出開始/結束日期/時間,並回答您的開始/結束尺寸。從這些數字中你可以剪下你的檔案。

你說的是一個很大的文件。所以我不建議你這樣做行號有可能head MyFile.log -n xxx | tail -n yyy。會很長。更好地處理尺寸。

筆記:

  • 如果這是一個帶有格式化輸出的日誌(即使您不知道),那麼它總是可能存在來自開發公司/程式設計師的某種分析工具。即使多年後它也可能會出現。恕我直言,最好不要觸及該格式並建立一個單獨的檔案。
  • 寫入你的腳本參數,例如目前的PID(如果你需要手動殺死),檔案名稱(日誌物件),如果你知道產生日誌的程式的PID...
  • 如果您遇到以下情況,則循環可以永遠或結束:產生日誌的程式的PID不再存在,檔案不再存在,實際大小小於舊的(您移動檔案或重新啟動日誌(您需要重新啟動索引)。
  • 如果您將 $LastSize 保留在記憶體中,您可以決定避免在不需要時在「日誌的日誌」中列印行,或在很長時間沒有活動後停止(或動態修改時間間隔...)

相關內容