Odoo 紀錄檔用光硬碟空間時要怎麼辦?

解決紀錄檔太大時難以開啟或系統當機的問題

Andy Cheng

龐大的紀錄檔

當進行資料匯入或模組開發的時候,資料庫常有大量存取, PostgreSQL 和 Odoo 就可能會產生大量的紀錄檔,尤其是一邊要偵錯,必須要讓 PostgreSQL  和 Odoo 記錄所有細節的時候。這些記錄檔如果沒有清理,很容易就會佔去大量的硬碟空間。我們在為客戶從舊系統轉移到 Odoo 的時候,就曾經發生過產生了超過 30 GB 的紀錄檔,導致系統當機的情況。即使沒有以上的情況,日積月累下來,紀錄檔仍然會佔去可觀的硬碟空間。有錯誤需要檢查紀錄檔時,龐大的紀錄檔也可能造成開啟檔案上的困難。

清理紀錄檔

最直觀的清理方式,就是由系統管理員定期將記錄檔清空,但是這個方式仰賴系統管理員的手動作業,而且萬一日後需要檢查紀錄的時候就麻煩了。而 Linux 系統上本來就內建有工具來解決這個問題。 Logrotate 是 Linux 上用來封存紀錄檔的工具,可以依照設定排程自動將舊的紀錄封存到另一個檔案並且壓縮,減少紀錄檔佔用的空間。

使用 Logrotate

Logrotate 封存的動作是透過設定檔內的選項決定,設定檔通常會放在 /etc/logrotate.conf 或 /etc/logrotate.d 之下的檔案。 如果有 /etc/logrotate.d 這個目錄的話,建議可以將不同程式的紀錄檔設定放在這個目錄下的不同檔案,方便管理。個別設定檔會有類似以下的內容:

/var/log/postgresql/*.log {
    weekly
    # 每週執行
    rotate 10
    # 最多保留 10 個舊紀錄檔
    copytruncate
    # 將記錄檔內容複製至別個檔案後清空紀錄檔
    delaycompress
    # 延後一次再壓縮紀錄檔
    compress
    # 壓縮舊紀錄檔
    notifempty
    # 如果紀錄檔為空,暫不封存
    missingok
    # 找不到記錄檔也不會發出錯誤訊息
    su root root
    # 以 root:root 身份執行
    create 640 postgres postgres
    # 以 root:root 身份建立舊紀錄檔
}

第一行的「/var/log/postgresql/*.log」是指定 PostgreSQL 紀錄檔的路徑。每個設定區塊({ 到 } 及之間的內容)之前都要指定該區塊的封存記錄檔路徑。其他設定區塊內的常用選項如下:

daily

每天封存。以 Odoo 和 PostgreSQL 來說,建議使用這個選項。

weekly

每週封存

monthly

每月封存

yearly

每年封存

rotate [count]

保留 [count] 個封存記錄檔,超過這個設定數字時,會從最舊的封存記錄檔開始刪除。

crompress

壓縮封存後的紀錄檔。強烈建議使用這個選項,可以有效地減少封存記錄檔的大小。

delaycrompress

延後一次壓縮封存紀錄檔。每次執行時封存的紀錄檔會等到下一次執行的時候才封存。

missingok

指定的紀錄檔路徑找不到檔案時,不會發出錯誤警告。

notifempty

不封存空白紀錄檔

create [rwx] [user] [group]

建立封存檔案時的權限。 [rwx] 為 Linux 檔案的權限,例如 640 。 [user] 為檔案擁有者 。 [group] 為檔案所屬群組。

以 Odoo 為例

/var/log/odoo/*.log {
    daily
    missingok
    rotate 70
    compress
    delaycompress
    notifempty
    create 640 odoo odoo
}

此處對 Odoo 的紀錄檔所在目錄下,以 .log 結尾的檔案每天進行封存。 Odoo 紀錄檔的位置預設為 /var/log/odoo ,或是設定在 Odoo 設定檔( 通常在 /etc/odoo-server.conf )內的 logfile 選項。保留 70 個封存的檔案,封存後的檔案在下一次封存動作時會被壓縮。

若以 Logrotate 來封存 Odoo 紀錄檔時,請記得將 Odoo 設定檔內的 logrotate 選項關掉。

附註