Categories: Linux

Linux 記錄檔輪替管理 logrotate 教學與範例

介紹如何在 Linux 系統中使用 logrotate 管理系統各類記錄檔的輪替、壓縮與保存。

logrotate 記錄檔管理工具

在 Linux 系統上大部分的系統記錄檔都會放在 /var/log 目錄以及子目錄中,但系統各種記錄檔的內容會持續累積,若沒有定期管理與清理,就會不斷增長,造成記錄檔過於龐大的問題。

logrotate 是一個專門用來管理系統記錄檔的工具,它負責定期整理系統記錄檔,將舊的記錄檔壓縮保存,或是刪除過期的記錄檔,避免記錄檔灌爆磁碟空間。

安裝 logrotate

正常來說,一般的 Linux 發行版都會安裝好 logrotate,如果遇到特殊狀況需要自行安裝,可以使用 yumapt 安裝:

# 安裝 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 記錄檔擁有者與群組為 rootsyslog
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 設定檔之後,只要確認設定無誤,就會自動生效,不需要重新載入設定檔的動作。

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago