Grep
如何對每 500MB / 天滾動的文件進行 tail -f 處理?
我想執行以下操作來監視日誌文件中的模式:
tail -f ./app.log | grep "My Pattern: .*" >> ./MyPattern.txt &
這工作正常,直到
app.log
達到 500MB 並且它被移動app-2015-10-28.0.log
並創建一個新app.log
的。發生這種情況時,tail -f
將停止工作。停止並再次執行相同的命令將起作用,但在停止和啟動之間,可能會錯過重新啟動之間出現的模式。滾動的另一個條件是在 00:00 時。即使日誌小於 500MB,也會發生相同的滾動。
日誌滾動是在應用程序級別完成的,我們無法控制那部分。
我們怎樣才能檢測到日誌已經滾動,而不會錯過感興趣的模式?
tail
通常跟在文件描述符 (--follow=descriptor
) 之後,當日誌文件滾動或文件被移走時,該描述符變得不可訪問。從以下的手冊頁中看到tail
:
- 重試
即使文件不可訪問或變得不可訪問,也要繼續嘗試打開文件;在按名稱跟踪時很有用,即使用 –follow=name
所以像這樣使用它(
tail
現在跟隨名稱而不是描述符):tail --follow=name --retry logfile | grep "pattern"
當文件被截斷或移走時,您將在尾部輸出中看到:
$ tail --follow=name --retry logfile [...] tail: logfile: file truncated [...] tail: `logfile' has become inaccessible: No such file or directory tail: `logfile' has appeared; following end of new file [...]