介紹如何在 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 | 不延遲壓縮記錄檔。 |
Email 寄送記錄檔
以下指令可以讓 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 設定檔之後,只要確認設定無誤,就會自動生效,不需要重新載入設定檔的動作。
