介紹如何在 Linux 系統中使用 logrotate
管理系統各類記錄檔的輪替、壓縮與保存。
logrotate
記錄檔管理工具在 Linux 系統上大部分的系統記錄檔都會放在 /var/log
目錄以及子目錄中,但系統各種記錄檔的內容會持續累積,若沒有定期管理與清理,就會不斷增長,造成記錄檔過於龐大的問題。
logrotate
是一個專門用來管理系統記錄檔的工具,它負責定期整理系統記錄檔,將舊的記錄檔壓縮保存,或是刪除過期的記錄檔,避免記錄檔灌爆磁碟空間。
logrotate
正常來說,一般的 Linux 發行版都會安裝好 logrotate
,如果遇到特殊狀況需要自行安裝,可以使用 yum
或 apt
安裝:
# 安裝 logrotate(Ubuntu/Debian) sudo apt install logrotate # 安裝 logrotate(RHEL/CentOS) sudo yum install logrotate
logrotate
設定檔logrotate
主要的設定檔位於 /etc/logrotate.conf
,其內容會類似這樣:
# 每週進行一次記錄檔輪替 weekly # 記錄檔擁有者與群組為 root 與 syslog su root syslog # 保留 4 次輪替的記錄檔 rotate 4 # 輪替之後,自動建立新的記錄檔 create # 壓縮輪替後的記錄檔 compress # 套用一般套件的記錄檔設定 include /etc/logrotate.d # ...
在 /etc/logrotate.conf
中會包含一些預設的設定值,例如記錄檔的輪替頻率、保留數量等,而對於個別套件或服務(例如 nginx 等)的記錄檔輪替設定,則會放在 /etc/logrotate.d
目錄中,透過這裡的 include
來套用個別套件的記錄檔設定。
以 nginx 伺服器的記錄檔輪替設定 /etc/logrotate.d/nginx
來說,其設定內容會類似這樣:
# nginx 記錄檔輪替設定 /var/log/nginx/*.log { # 記錄檔位置 daily # 每日輪替一次 missingok # 忽略記錄檔不存在問題 rotate 14 # 保留 14 次輪替的記錄檔 compress # 壓縮輪替後的記錄檔 delaycompress # 延遲壓縮記錄檔 notifempty # 不輪替空的記錄檔 create 0640 www-data adm # 記錄檔擁有者/群組為 www-data/adm,權限為 0640 sharedscripts # 所有記錄檔輪替,只執行一次 prerotate 與 postrotate 指令稿 prerotate # 輪替前指令稿 if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi \ endscript postrotate # 輪替後指令稿 invoke-rc.d nginx rotate >/dev/null 2>&1 endscript }
在個別服務的設定中,可以針對不同的服務來給予不同的設定,若沒有指定的話,就會套用 /etc/logrotate.conf
中預設的設定。
以下是一些 logrotate
中常用的基本設定指令:
指令 | 說明 |
---|---|
su root syslog |
記錄檔擁有者與群組為 root 與 syslog 。 |
missingok |
忽略記錄檔不存在問題。 |
notifempty |
不輪替空檔案。 |
ifempty |
輪替空檔案。 |
rotate 7 |
保留 7 次輪替的記錄檔。 |
在 logrotate
中可以透過以下幾種方式來指定記錄檔的輪替頻率:
指令 | 說明 |
---|---|
daily |
每日輪替。 |
weekly |
每週輪替。 |
monthly |
每月輪替。 |
yearly |
每年輪替。 |
size 100k |
檔案超過 100k 時輪替。 |
size 2M |
檔案超過 2M 時輪替。 |
size 1G |
檔案超過 1G 時輪替。 |
除了上述的幾種常用的指令之外,還有以下幾種進階的設定:
指令 | 說明 |
---|---|
minage 3 |
不輪替 3 天以內建立的記錄檔。 |
maxage 30 |
不保留 30 天以前的記錄檔。 |
maxsize 100k |
搭配 daily 等間隔條件使用,檔案超過 100k 或達到間隔條件時輪替。 |
minsize 100k |
搭配 daily 等間隔條件使用,檔案超過 100k 同時達到間隔條件時輪替。 |
壓縮相關的設定指令如下:
指令 | 說明 |
---|---|
compress |
壓縮輪替後的舊記錄檔。 |
nocompress |
不壓縮輪替後的舊記錄檔。 |
delaycompress |
延遲壓縮記錄檔。 |
nodelaycompress |
不延遲壓縮記錄檔。 |
以下指令可以讓 logrotate
透過 email 寄送記錄檔:
指令 | 說明 |
---|---|
mail www@my.org |
將過期的記錄檔寄送至 www@my.org 。 |
nomail |
不以 Email 寄送記錄檔。 |
mailfirst |
寄送最新輪替的記錄檔。 |
maillast |
寄送過期(將刪除)的記錄檔。 |
以下指令可以讓 logrotate
將舊的記錄檔存放在獨立的目錄中:
指令 | 說明 |
---|---|
olddir /var/log/old |
將舊記錄檔放在 /var/log/old 目錄。 |
noolddir |
將舊記錄檔放在相同目錄。 |
createolddir 0755 root admin |
指定 0755 權限、root 使用者、admin 群組,建立舊記錄檔目錄。 |
nocreateolddir |
不要自動建立舊記錄檔目錄。 |
以下指令可以讓 logrotate
使用日期的方式來為舊的記錄檔命名:
指令 | 說明 |
---|---|
dateext |
使用日期的方式來為舊的記錄檔命名。 |
dateyesterday |
以昨天的日期為檔案命名基準。 |
dateformat -%Y%m%d |
設定日期格式,格式請參考 strftime 的文件。 |
nodateext |
不使用日期來為舊的記錄檔命名。 |
如果在記錄檔中存在敏感性資料,可以使用以下 logrotate
指令,特別處理要進行銷毀的資料:
指令 | 說明 |
---|---|
shred |
使用 shred 銷毀要刪除的記錄檔。 |
shredcycles 3 |
設定 shred 抹除次數為 3 。 |
noshred |
不使用 shred 銷毀記錄檔。 |
logrotate
設定在修改完 logrotage
的設定之後,可以使用以下指令測試設定檔是否正確:
# 測試 logrotate 設定 sudo logrotate -d /etc/logrotate.conf
如果沒有出現錯誤訊息,就完成了。
由於 logrotate
是透過 cron 來觸發的,通常是寫在 /etc/cron.daily/logrotate
中,所以更改 logrotate
設定檔之後,只要確認設定無誤,就會自動生效,不需要重新載入設定檔的動作。