2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不再支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

24.3. 日誌檔案維護 #

將資料庫伺服器的日誌輸出儲存到某處是一個好主意,而不是簡單地透過 /dev/null 丟棄。日誌輸出在診斷問題時非常有價值。

注意

伺服器日誌可能包含敏感資訊,無論其如何儲存、儲存在哪裡或路由到何處,都需要對其進行保護。例如,某些 DDL 語句可能包含明文密碼或其他認證詳細資訊。記錄 ERROR 級別的語句可能會顯示應用程式的 SQL 原始碼,並且可能還包含部分資料行。記錄資料、事件和相關資訊是此功能的目標,因此這不是洩露或錯誤。請確保伺服器日誌僅對授權人員可見。

日誌輸出往往非常龐大(尤其是在較高的除錯級別時),因此您不會想無限期地儲存它。您需要輪換日誌檔案,以便在合理的時間段後啟動新的日誌檔案並刪除舊的日誌檔案。

如果您只是將 postgresstderr 重定向到一個檔案,您將獲得日誌輸出,但截斷日誌檔案的唯一方法是停止並重啟伺服器。如果您在開發環境中使用 PostgreSQL,這可能可以接受,但很少有生產伺服器會認為這種行為可以接受。

更好的方法是將伺服器的 stderr 輸出傳送到某種日誌輪換程式。有一個內建的日誌輪換功能,您可以透過在 postgresql.conf 中將配置引數 logging_collector 設定為 true 來使用它。該程式的控制引數在 第 19.8.1 節 中描述。您還可以使用此方法以機器可讀的CSV(逗號分隔值) 格式捕獲日誌資料。

或者,如果您已經在使用某個外部日誌輪換程式與其他伺服器軟體配合使用,您可能更喜歡使用它。例如,Apache 發行版中包含的 rotatelogs 工具可以與 PostgreSQL 一起使用。一種方法是將伺服器的 stderr 輸出透過管道傳遞給所需的程式。如果您使用 pg_ctl 啟動伺服器,那麼 stderr 已經被重定向到 stdout,所以您只需要一個管道命令,例如

pg_ctl start | rotatelogs /var/log/pgsql_log 86400

您可以透過設定 logrotate 來收集 PostgreSQL 內建日誌收集器生成的日誌檔案,從而結合這些方法。在這種情況下,日誌收集器定義日誌檔案的名稱和位置,而 logrotate 定期歸檔這些檔案。在啟動日誌輪換時,logrotate 必須確保應用程式將進一步的輸出傳送到新檔案。這通常是透過一個 postrotate 指令碼來完成的,該指令碼嚮應用程式傳送一個 SIGHUP 訊號,然後應用程式會重新開啟日誌檔案。在 PostgreSQL 中,您可以改用帶 logrotate 選項的 pg_ctl。當伺服器收到此命令時,伺服器會根據日誌配置(參見 第 19.8.1 節)切換到新日誌檔案或重新開啟現有日誌檔案。

注意

在使用靜態日誌檔名時,如果達到最大開啟檔案數限制或發生檔案表溢位,伺服器可能無法重新開啟日誌檔案。在這種情況下,日誌訊息會發送到舊日誌檔案,直到成功進行日誌輪換。如果 logrotate 配置為壓縮日誌檔案並刪除它,伺服器可能會丟失在此期間記錄的訊息。為了避免此問題,您可以配置日誌收集器動態分配日誌檔名,並使用 prerotate 指令碼來忽略已開啟的日誌檔案。

另一種生產級別的日誌輸出管理方法是將其傳送到 syslog,然後讓 syslog 處理檔案輪換。要做到這一點,請在 postgresql.conf 中將配置引數 log_destination 設定為 syslog(僅記錄到 syslog)。然後,您可以隨時向 syslog 守護程序傳送一個 SIGHUP 訊號,以強制它開始寫入新的日誌檔案。如果您想自動化日誌輪換,可以配置 logrotate 程式與 syslog 的日誌檔案一起工作。

然而,在許多系統上,syslog 並不可靠,尤其是處理大型日誌訊息時;它可能會在您最需要它們的時候截斷或丟棄訊息。此外,在 Linux 上,syslog 會將每條訊息重新整理到磁碟,導致效能不佳。(您可以在 syslog 配置檔案中的檔名開頭使用-來停用同步。)

請注意,上面描述的所有解決方案都負責在可配置的間隔開始新的日誌檔案,但它們不處理舊的、不再有用的日誌檔案的刪除。您可能需要設定一個批處理作業來定期刪除舊日誌檔案。另一種可能性是配置輪換程式,以便舊日誌檔案被迴圈覆蓋。

pgBadger 是一個進行復雜日誌檔案分析的外部專案。check_postgres 在日誌檔案中出現重要訊息時提供 Nagios 警報,並檢測許多其他異常情況。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。