一日一技:使用 Linux 自帶的 logrotate 管理你的所有日誌

  • 2019 年 10 月 28 日
  • 筆記

攝影:產品經理

吃飯:kingname & 產品經理

我們在開發的過程中,會創建非常多的日誌,對日誌進行 rotate 是一個基本要求。

所謂的rotate,可以理解為對日誌按照一定的規則進行切分。例如,每天晚上0點生成一個新的日誌文件,並把老的文件歸檔。又或者每個日誌文件超過多少 MB 以後就自動切分,並把老的內容單獨存檔或者壓縮。存檔以後的日誌文件保存多少個。超過數量以後先刪除老日誌再刪除新日誌。

如果我們使用的是 Python,那麼我們可以使用自帶的logging模組或者第三方的logoru來寫日誌。但如果我們使用像是 MongoDB這種第三方的軟體,那麼要對日誌進行 rotate 就非常麻煩了。如果不加以管理,MongoDB 的日誌很容易就達到幾十GB。

還有其他軟體,他們的日誌散落在系統的各個位置,我們應該如何替他們 rotate 呢?

如果你的系統是 Linux,那麼主流發行版一般都會自帶一個軟體,叫做logrotate,通過簡單的配置,就能讓它幫你管理系統中各個地方的日誌。

我們以 MongoDB 為例來進行說明。

MongoDB 的日誌默認放在/var/log/mongodb文件夾中,如下圖所示:

如果不干涉,那麼所有的日誌內容會無限制追加到這一個mongod.log文件中。並且,如果你的 MongoDB 正在運行,即使你使用rm命令刪除了這個文件,它佔用的空間也不會釋放。

但使用logrotate來管理這個文件以後,它能通過truncate操作清空這個文件,從而實現釋放空間的目的。

logrotate的配置文件地址有兩個,第一個主配置文件地址為/etc/logrotate.conf,其內容如下:

另一個專門用於存放配置文件的地址為/etc/logrotate.d/,它裡面的每一個文件都是一個配置文件,如下圖所示:

我們要使用logrotate來管理 MongoDB,所以就在/etc/logrotate.d/文件夾中創建一個mongodb文件(文件名可以任意取),內容如下:

/var/log/mongodb/*.log {      rotate 5      copytruncate      missingok      compress      maxsize 200M      daily  }

如下圖所示:

這個配置文件的意義如下:

*第一行用於指定 MongoDB 日誌文件的地址為/var/log/mongodb/文件夾下面所有以.log結尾的文件。

  • rotate 5表示保留5份日誌文件
  • copytruncate 表示,日誌滿足要求以後,先複製一份,然後把原來的日誌文件清空
  • missingok 表示如果這個文件夾下面為空,也沒關係,自動忽略
  • compress 表示要把日誌進行壓縮
  • maxsize 200M 表示每個日誌最多200MB,達到200MB 以後,就進行 rotate。
  • daily 表示每天檢查一次

保存這個文件,logrotate將會每天自動檢查 MongoDB 的日誌文件,如果發現它大小達到了200MB,那麼首先會把這個日誌複製出來一份(此時將會佔用400MB 空間),然後把原來的日誌文件內容清空(此時恢復200MB 空間佔用)。被複制出來的日誌文件會被壓縮,並存放在當前文件夾中。當日誌數量達到5個的時候,第六個日誌文件生成,最開始壓縮的那個文件被刪除。從而保證 MongoDB 的日誌及其備份總共佔用空間不超過1GB。

logrotate非常強大,還有非常多的配置參數用於實現各種日誌管理的操作,大家可以執行命令man logrotate查看它的幫助文檔。

Tags: