支援的版本:目前 (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 警報,並偵測許多其他異常情況。

提交更正

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