Odoo 紀錄檔用光硬碟空間時要怎麼辦?
解決紀錄檔太大時難以開啟或系統當機的問題
龐大的紀錄檔
當進行資料匯入或模組開發的時候,資料庫常有大量存取, 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 選項關掉。
附註
想看 Logrotate 的原始碼的人可以看這邊 https://github.com/logrotate/logrotate 的 GitHub repository 。
完整的 Logrotate 使用說明可以看 Linux 的 Logrotate man page 。