Linux

從日誌文件中刪除 6 個月大的日誌的 shell 腳本

  • January 5, 2017

我有大小為 6.2 GB 的日誌文件,該程序正在使用該文件,並且它不斷將日誌寫入該文件。現在我不想輪換日誌,但我確實想清理這個日誌文件。我想從此文件中刪除超過 6 個月的日誌。是否可以使用 shell 腳本讀取日誌文件並刪除超過 6 個月的日誌?

以下是日誌格式

10.0.3.xx - - [17/Jun/2016:14:21:59 +0000] "GET /visible_topics HTTP/1.1" 200 581 "-" "help/97a1dd7eb981421b9719adde381560a78bed0b66 (ip-10-0-3-xxx; user1; 4411) ruby/2.3.0 (0; x86_64-linux)" 

解決方案確實是使用logrotate:它工作得很好,它還可以壓縮旋轉的日誌。

如果你真的不想使用 logrotate,你必須手動 cat/copy 日誌文件的相關部分到一個新的,然後刪除舊的。

如果沒有您的日誌格式的詳細範例,就不可能為您提供有關所需 shell 命令的任何建議。

無論如何,你真的應該使用 logrotate。

我想從此文件中刪除超過 6 個月的日誌。

我不清楚你的意思,但如果我不得不猜測,你想從這個文件中刪除超過 6 個月的日誌文件**條目。**如果是這樣的話,它是可以做到的,但它是在 *nix 系統上管理日誌的一種相當特別的方式。

您想要做的(如果我的假設是正確的)將需要解析該文件中的每一行並確定時間戳,以測試輸入日期是否在您目前的 6 個月視窗內。根據時間戳的通過/失敗,您將寫出沒有“舊”條目的新日誌文件。您可以使用grephead之類的 shell 工具tail來實現這一點,但為了提高性能,您可能需要考慮專門為您的需要量身定制的自定義編譯 C 應用程序。

我不知道這個日誌文件在哪種硬體上,但是這個日誌文件的絕對大小(6.8 GB)在解析舊條目和編寫新條目時可能會導致嚴重的性能瓶頸。在大多數情況下,當事情變得如此麻煩時,通常表明該過程需要審查。但是,該規則存在一些極端情況。祝你好運。

引用自:https://serverfault.com/questions/824237