Linux

Logcheck 忽略 Logrotate

  • December 23, 2019

我繼承了一個同時使用 logcheck 和 logrotate 的系統。我遇到的問題是 logrotate 正在發送一封令人討厭的電子郵件,其中包含以下內容:

*** WARNING ***: Log file (X) is smaller than last time checked!

每當 logrotate 旋轉一個監視的文件時。這些工具似乎可以很好地配合使用,所以我很好奇如何實現它。

這看起來很簡單,如果我在某處的幫助文件中提出一個愚蠢的問題,我深表歉意。

Ubuntu 18.04、logcheck 1.3.17、logrotate 3.11.0 - 版權所有 (C) 1995-2001 Red Hat, Inc.

附加問題,因為 ‘copytruncate’ 是用於管理文件輪換的方法:

輪換日誌的服務是 Django / Apache 應用程序。服務本身(和文件)不能真正停止輪換過程,因為它是一個需要正常執行時間的網路伺服器。你能指出我開始乾淨地旋轉這些文件的正確方向嗎?這個過程已經讓 logrotate 和 logcheck 非常乾淨地一起執行,但是我們最近升級到了 Python 3.1,這可能導致了潛在的問題。

第二個附錄:這個問題可能是由於開發人員對某些衝突的文件大小限制(Django 將日誌限制為 4M 並且 logrotate 以 5M 旋轉)感到惱火併自行截斷日誌造成的。知道 logrotate + logcheck 具有強大的可靠記錄非常有幫助。

我在 Debian 系統上使用logcheck+logrotate已有 20 年了,目前在大約 60 個 Debian 版本 8、9 和 10 伺服器上使用它們,我從未見過來自logcheck. 所以我做了一點探勘。

消息實際上並非來自logcheck其自身,而是來自logtail2(或者,最初,logtail),它logcheck位於作為依賴項引入的輔助包中。根據logtail包描述,兩個版本之間的主要區別在於logtail2更好地處理已旋轉的文件。鑑於此,我將首先檢查logtaillogcheck使用的是哪個:

$ grep logtail /usr/sbin/logcheck 
LOGTAIL="/usr/sbin/logtail2"
       || error "Could not run logtail or save output"

驗證LOGTAIL設置為的第一行,而logtail2不是logtail

假設它正在使用logtail2(應該如此),“日誌文件較小”警告僅在文件縮小inode 編號保持不變時發出 - 換句話說,如果文件已就地重寫。有時這樣做是為了處理不夠智能的服務,無法根據需要重新創建日誌文件,因此通過複製日誌然後將大小重置為 0 而不是通過重命名並創建新文件來輪換日誌。因為這是處理日誌輪換的一種不尋常(而且相當老套,更不用說有風險,因為它創建了一個可能導致日誌消息失去的競爭條件)方式,所以我猜你只有少數出現此警告的日誌文件。

此問題的最佳解決方案是修復相關日誌的輪換設置,以便以“正常”方式處理它們,而不是覆蓋舊日誌。為此,grep您的 logrotate 規則適用於使用該copytruncate選項的任何日誌,然後確定需要做什麼才能讓這些服務在不使用的情況下允許輪換copytruncate- 實現此目的的蠻力方法是在prerotate腳本中停止服務並重啟它postrotate,但通常有更好的方法,比如向它發送一個特定的信號,告訴它重新打開它的日誌文件。(如果您沒有找到任何提及的內容copytruncate,也可以在輪換腳本中手動實現該技術,您必須手動查找而不是使用grep.)

如果這不是一個選項,您可以在logcheck規則目錄中創建忽略規則,告訴它忽略那些警告行,但這取決於它們是作為標準異常日誌條目處理還是繞過忽略系統。

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