支援的版本:目前 (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

19.8. 錯誤報告與日誌記錄 #

19.8.1. 日誌記錄到哪裡 #

log_destination (string) #

PostgreSQL 支援多種記錄伺服器訊息的方法,包括 stderrcsvlogjsonlogsyslog。在 Windows 上,也支援 eventlog。將此參數設定為以逗號分隔的所需日誌記錄目的地清單。預設值僅記錄到 stderr。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

如果 csvlog 包含在 log_destination 中,則日誌條目將以「逗號分隔值」(CSV)格式輸出,這方便將日誌載入到程式中。有關詳細資訊,請參閱第 19.8.4 節logging_collector 必須啟用才能產生 CSV 格式的日誌輸出。

如果 jsonlog 包含在 log_destination 中,則日誌條目將以JSON格式輸出,這方便將日誌載入到程式中。有關詳細資訊,請參閱第 19.8.5 節logging_collector 必須啟用才能產生 JSON 格式的日誌輸出。

當包含 stderrcsvlogjsonlog 時,將建立檔案 current_logfiles 以記錄目前日誌收集器正在使用的日誌檔案位置以及相關的日誌記錄目的地。這提供了一種方便的方法來尋找實例目前正在使用的日誌。以下是此檔案內容的範例

stderr log/postgresql.log
csvlog log/postgresql.csv
jsonlog log/postgresql.json

current_logfiles 會在輪替效果建立新日誌檔案時,以及重新載入 log_destination 時重新建立。當 log_destination 中未包含 stderrcsvlogjsonlog,以及停用日誌收集器時,會將其移除。

注意

在大多數 Unix 系統上,您需要變更系統 syslog 精靈的配置,才能使用 log_destinationsyslog 選項。PostgreSQL 可以記錄到 syslog 工具 LOCAL0LOCAL7(請參閱syslog_facility),但大多數平台上的預設 syslog 配置會捨棄所有此類訊息。您需要將類似以下內容新增到

local0.*    /var/log/postgresql

syslog 精靈的配置檔案中才能使其運作。

在 Windows 上,當您使用 log_destinationeventlog 選項時,您應該向作業系統註冊事件來源及其程式庫,以便 Windows 事件檢視器可以清楚地顯示事件日誌訊息。有關詳細資訊,請參閱第 18.12 節

logging_collector (boolean) #

這個參數啟用記錄收集器,它是一個背景處理程序,會捕捉傳送到 stderr 的記錄訊息,並將它們重新導向到記錄檔中。這種方法通常比記錄到 syslog 更有用,因為某些類型的訊息可能不會出現在 syslog 輸出中。(一個常見的例子是動態連結器的失敗訊息;另一個是由 archive_command 等腳本產生的錯誤訊息。)這個參數只能在伺服器啟動時設定。

注意

即使不使用記錄收集器,也可以記錄到 stderr;記錄訊息只會傳送到伺服器的 stderr 所導向的地方。但是,這種方法只適用於少量記錄,因為它無法提供方便的方法來輪替記錄檔。此外,在某些平台上,不使用記錄收集器可能會導致記錄輸出遺失或損壞,因為多個處理程序同時寫入同一個記錄檔可能會覆寫彼此的輸出。

注意

記錄收集器的設計目的是永不遺失訊息。這表示在極高的負載下,當收集器落後時,伺服器處理程序可能會在嘗試傳送其他記錄訊息時被封鎖。相反,syslog 傾向於捨棄無法寫入的訊息,這表示它可能無法記錄某些情況下的訊息,但不會封鎖系統的其餘部分。

log_directory (string) #

當啟用 logging_collector 時,此參數決定將建立記錄檔的目錄。它可以指定為絕對路徑,或相對於叢集資料目錄的路徑。這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。預設值為 log

log_filename (string) #

當啟用 logging_collector 時,此參數設定所建立記錄檔的檔案名稱。該值被視為 strftime 模式,因此可以使用 % 逸出字元來指定隨時間變化的檔案名稱。(請注意,如果存在任何與時區相關的 % 逸出字元,則計算會在 log_timezone 指定的時區中完成。)支援的 % 逸出字元與 Open Group 的 strftime 規格中列出的相似。請注意,系統的 strftime 不會直接使用,因此特定於平台的(非標準)擴充功能將無法運作。預設值為 postgresql-%Y-%m-%d_%H%M%S.log

如果您指定一個沒有逸出字元的檔案名稱,您應該計劃使用記錄輪替工具來避免最終填滿整個磁碟。在 8.4 之前的版本中,如果不存在 % 逸出字元,PostgreSQL 將會附加新記錄檔建立時間的 epoch,但現在已不再是這種情況。

如果在 log_destination 中啟用了 CSV 格式輸出,則 .csv 將會附加到帶時間戳記的記錄檔名,以建立 CSV 格式輸出的檔案名稱。(如果 log_filename.log 結尾,則會改為取代該後綴。)

如果在 log_destination 中啟用了 JSON 格式輸出,則 .json 將會附加到帶時間戳記的記錄檔名,以建立 JSON 格式輸出的檔案名稱。(如果 log_filename.log 結尾,則會改為取代該後綴。)

這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

log_file_mode (integer) #

在 Unix 系統上,當啟用 logging_collector 時,此參數會設定記錄檔的權限。(在 Microsoft Windows 上,此參數會被忽略。)參數值預期為以 chmodumask 系統呼叫接受的格式指定的數字模式。(要使用習慣的八進位格式,該數字必須以 0(零)開頭。)

預設權限為 0600,表示只有伺服器擁有者才能讀取或寫入記錄檔。另一個常見的有用設定是 0640,允許擁有者群組的成員讀取檔案。但是,請注意,要使用這樣的設定,您需要更改 log_directory,將檔案儲存在叢集資料目錄之外的某個位置。在任何情況下,將記錄檔設定為世界可讀是不明智的,因為它們可能包含敏感資料。

這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

log_rotation_age (integer) #

當啟用 logging_collector 時,此參數決定使用單個記錄檔的最長時間,之後將建立一個新的記錄檔。如果未指定單位,則此值將被視為分鐘。預設值為 24 小時。設定為零可停用基於時間的新記錄檔建立。這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

log_rotation_size (integer) #

當啟用 logging_collector 時,此參數決定單個記錄檔的最大大小。在此數量的資料已發送到記錄檔後,將建立一個新的記錄檔。如果未指定單位,則此值將被視為千位元組。預設值為 10 百萬位元組。設定為零可停用基於大小的新記錄檔建立。這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

log_truncate_on_rotation (boolean) #

啟用 logging_collector 時,此參數會讓 PostgreSQL 截斷(覆寫)現有同名日誌檔,而不是附加到檔案末尾。但是,只有在因為基於時間的輪替開啟新檔案時才會發生截斷,而不是在伺服器啟動或基於大小的輪替期間。關閉時,在所有情況下都會附加到現有檔案。例如,將此設定與像 postgresql-%H.log 這樣的 log_filename 結合使用,會產生 24 個每小時的日誌檔,然後循環覆寫它們。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

範例:要保留 7 天的日誌,每天一個日誌檔,命名為 server_log.Monserver_log.Tue 等,並自動將上週的日誌覆寫為本週的日誌,請將 log_filename 設定為 server_log.%alog_truncate_on_rotation 設定為 on,並且 log_rotation_age 設定為 1440

範例:要保留 24 小時的日誌,每小時一個日誌檔,但如果日誌檔大小超過 1GB,也更快地進行輪替,請將 log_filename 設定為 server_log.%H%Mlog_truncate_on_rotation 設定為 onlog_rotation_age 設定為 60,並且 log_rotation_size 設定為 1000000。在 log_filename 中包含 %M,允許任何可能發生的大小驅動輪替選擇與該小時初始檔案名不同的檔案名。

syslog_facility (enum) #

啟用紀錄到 syslog 時,此參數決定要使用的 syslog facility。您可以從 LOCAL0LOCAL1LOCAL2LOCAL3LOCAL4LOCAL5LOCAL6LOCAL7 中選擇;預設值為 LOCAL0。另請參閱您系統的 syslog 常駐程式的文件。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

syslog_ident (string) #

啟用紀錄到 syslog 時,此參數決定用來識別 PostgreSQL 訊息在 syslog 日誌中的程式名稱。預設值為 postgres。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

syslog_sequence_numbers (boolean) #

啟用紀錄到 syslog 且此參數為 on(預設值)時,每個訊息都會以遞增的序號作為前綴(例如 [2])。這可以避免許多 syslog 實作預設執行的 --- 最後一則訊息重複了 N 次 --- 抑制。在更新的 syslog 實作中,可以設定重複訊息抑制(例如,rsyslog 中的 $RepeatedMsgReduction),因此可能不需要此功能。此外,如果您確實想要抑制重複的訊息,可以關閉此功能。

這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

syslog_split_messages (boolean) #

啟用紀錄到 syslog 時,此參數決定訊息傳遞到 syslog 的方式。當為 on(預設值)時,訊息會按行分割,並且長行會被分割,以便它們可以容納到 1024 個位元組中,這是傳統 syslog 實作的典型大小限制。當為 off 時,PostgreSQL 伺服器日誌訊息會按原樣傳遞到 syslog 服務,並且由 syslog 服務來處理潛在的大型訊息。

如果 syslog 最終紀錄到文字檔案,那麼無論哪種方式效果都相同,最好將設定保持在 on,因為大多數 syslog 實作都無法處理大型訊息,或者需要特別設定才能處理它們。但是,如果 syslog 最終寫入到其他媒體,則可能需要或更有用的是將訊息邏輯地放在一起。

這個參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

event_source (string) #

啟用紀錄到 event log 時,此參數決定用來識別 PostgreSQL 訊息在日誌中的程式名稱。預設值為 PostgreSQL。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

19.8.2. 何時記錄 #

log_min_messages (enum) #

控制哪些訊息等級會寫入伺服器日誌。有效值為 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。每個等級都包含其後的所有等級。等級越晚,傳送到日誌的訊息就越少。預設值為 WARNING。請注意,LOG 在這裡的排名與 client_min_messages 中的排名不同。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_min_error_statement (enum) #

控制哪些造成錯誤情況的 SQL 指令會被記錄在伺服器日誌中。目前的 SQL 指令會包含在指定嚴重度或更高等級的任何訊息的日誌條目中。有效值為 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。預設值為 ERROR,表示造成錯誤、日誌訊息、致命錯誤或崩潰的指令會被記錄。若要有效地關閉失敗指令的日誌記錄,請將此參數設定為 PANIC。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_min_duration_statement (integer) #

如果指令執行時間至少達到指定的時間量,則記錄每個已完成指令的執行時間。例如,如果您將其設定為 250ms,那麼所有執行時間為 250 毫秒或更長的 SQL 指令都會被記錄。啟用此參數有助於追蹤應用程式中未最佳化的查詢。如果此值在指定時沒有單位,則以毫秒為單位。將此值設定為零會印出所有指令的執行時間。-1(預設值)會停用記錄指令執行時間。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

此設定會覆寫 log_min_duration_sample,這表示執行時間超過此設定的查詢不受抽樣的影響,並且總是會被記錄。

對於使用擴充查詢協定的用戶端,Parse、Bind 和 Execute 步驟的執行時間會被獨立記錄。

注意

當與 log_statement 一起使用此選項時,由於 log_statement 而被記錄的指令文字不會在執行時間日誌訊息中重複出現。如果您未使用 syslog,建議您使用 log_line_prefix 記錄 PID 或會話 ID,以便您可以使用進程 ID 或會話 ID 將指令訊息連結到稍後的執行時間訊息。

log_min_duration_sample (integer) #

允許對執行時間至少達到指定時間量的已完成指令的執行時間進行抽樣。這會產生與 log_min_duration_statement 種類相同的日誌條目,但僅針對已執行指令的子集,抽樣率由 log_statement_sample_rate 控制。例如,如果您將其設定為 100ms,那麼所有執行時間為 100 毫秒或更長的 SQL 指令都會被考慮進行抽樣。當流量過高而無法記錄所有查詢時,啟用此參數會很有幫助。如果此值在指定時沒有單位,則以毫秒為單位。將此值設定為零會抽樣所有指令的執行時間。-1(預設值)會停用抽樣指令執行時間。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

此設定的優先順序低於 log_min_duration_statement,這表示執行時間超過 log_min_duration_statement 的指令不受抽樣的影響,並且總是會被記錄。

其他關於 log_min_duration_statement 的注意事項也適用於此設定。

log_statement_sample_rate (floating point) #

決定執行時間超過 log_min_duration_sample 的指令中,將被記錄的指令所佔的比例。抽樣是隨機的,例如 0.5 表示從統計學上講,任何給定的指令有二分之一的機會被記錄。預設值為 1.0,表示記錄所有被抽樣的指令。將此值設定為零會停用抽樣的指令執行時間記錄,效果與將 log_min_duration_sample 設定為 -1 相同。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_transaction_sample_rate (floating point) #

設定除了因其他原因記錄的指令外,所有指令都被記錄的事務的比例。它適用於每個新的事務,而不管其指令的執行時間如何。抽樣是隨機的,例如 0.1 表示從統計學上講,任何給定的事務有十分之一的機會被記錄。log_transaction_sample_rate 有助於建立事務的樣本。預設值為 0,表示不要記錄來自任何額外事務的指令。將此值設定為 1 會記錄所有事務的所有指令。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

注意

與所有指令記錄選項一樣,此選項可能會增加相當大的開銷。

log_startup_progress_interval (integer) #

設定啟動程序將記錄有關仍在進行中的長時間運作之訊息的時間量,以及該運作之進一步進度訊息之間的時間間隔。預設值為 10 秒。設定為 0 會停用此功能。如果此值在指定時沒有單位,則以毫秒為單位。此設定會分別套用至每個運作。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

例如,如果同步資料目錄需要 25 秒,然後重置未記錄的關聯需要 8 秒,並且如果此設定具有預設值 10 秒,則在同步資料目錄已進行 10 秒後,將記錄一條訊息,而在進行 20 秒後再次記錄一條訊息,但對於重置未記錄的關聯則不會記錄任何內容。

表 19.2 說明了 PostgreSQL 使用的訊息嚴重性等級。如果日誌輸出傳送到 syslog 或 Windows 的 eventlog,則嚴重性等級會如表中所示進行轉換。

表 19.2. 訊息嚴重性等級

嚴重性 用法 syslog eventlog
DEBUG1 .. DEBUG5 提供越來越詳細的資訊,供開發人員使用。 DEBUG INFORMATION
INFO 提供使用者隱式要求之資訊,例如來自 VACUUM VERBOSE 的輸出。 INFO INFORMATION
NOTICE 提供可能對使用者有幫助的資訊,例如截斷長識別符的通知。 NOTICE INFORMATION
WARNING 提供可能問題的警告,例如在事務塊外部的 COMMIT NOTICE WARNING
錯誤 報告導致目前指令中止的錯誤。 WARNING 錯誤
LOG 報告管理者感興趣的資訊,例如檢查點活動。 INFO INFORMATION
致命錯誤 報告導致目前會話中止的錯誤。 ERR 錯誤
PANIC 報告導致所有資料庫會話中止的錯誤。 CRIT 錯誤

19.8.3. 要記錄什麼 #

注意

您選擇記錄的內容可能涉及安全性問題;請參閱第 24.3 節

application_name (string) #

application_name 可以是任何長度小於 NAMEDATALEN 個字元的字串(標準版本中為 64 個字元)。它通常在應用程式連接到伺服器時設定。該名稱將顯示在 pg_stat_activity 檢視表中,並包含在 CSV 記錄項目中。它也可以透過 log_line_prefix 參數包含在常規記錄項目中。只有可列印的 ASCII 字元才能在 application_name 值中使用。其他字元將被替換為C 風格的十六進位跳脫字元

debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean) #

這些參數可啟用發出各種偵錯輸出。設定後,它們會列印每個已執行查詢的結果剖析樹、查詢重寫器輸出或執行計畫。這些訊息會以 LOG 訊息層級發出,因此預設情況下它們會出現在伺服器記錄中,但不會傳送到用戶端。您可以透過調整 client_min_messages 和/或 log_min_messages 來變更它。這些參數預設為關閉。

debug_pretty_print (boolean) #

設定後,debug_pretty_print 會縮排 debug_print_parsedebug_print_rewrittendebug_print_plan 產生的訊息。這會產生比關閉時使用的 精簡 格式更具可讀性但更長的輸出。 預設為開啟。

log_autovacuum_min_duration (integer) #

如果 autovacuum 執行的每個動作至少運行指定的時長,則會導致記錄該動作。將其設定為零會記錄所有 autovacuum 動作。-1 停用記錄 autovacuum 動作。如果未指定單位,則此值被視為毫秒。例如,如果您將此設定為 250ms,則所有運行 250 毫秒或更長時間的自動 vacuum 和 analyze 都會被記錄。此外,當此參數設定為除 -1 之外的任何值時,如果由於衝突的鎖定或並行刪除的關係而跳過 autovacuum 動作,則會記錄一條訊息。預設值為 10min。啟用此參數有助於追蹤 autovacuum 活動。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定;但可以透過變更表格儲存參數來覆寫個別表格的設定。

log_checkpoints (boolean) #

導致檢查點和重新啟動點記錄在伺服器記錄中。一些統計資訊包含在記錄訊息中,包括寫入的緩衝區數量和花費在寫入它們的時間。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。預設為開啟。

log_connections (boolean) #

導致每個嘗試連接到伺服器的連接都會被記錄,以及成功完成用戶端身份驗證(如果需要)和授權。只有超級使用者和具有適當 SET 權限的使用者才能在會話開始時變更此參數,並且它在會話中根本無法變更。預設值為 off

注意

某些用戶端程式(例如 psql)在確定是否需要密碼時會嘗試連接兩次,因此重複的接收到連接訊息並不一定表示存在問題。

log_disconnections (boolean) #

導致記錄會話終止。記錄輸出提供與 log_connections 類似的資訊,以及會話的持續時間。只有超級使用者和具有適當 SET 權限的使用者才能在會話開始時變更此參數,並且它在會話中根本無法變更。預設值為 off

log_duration (boolean) #

導致記錄每個已完成語句的持續時間。預設值為 off。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

對於使用擴充查詢協定的用戶端,Parse、Bind 和 Execute 步驟的執行時間會被獨立記錄。

注意

啟用 log_duration 和將 log_min_duration_statement 設定為零之間的區別在於,超過 log_min_duration_statement 會強制記錄查詢的文字,但此選項不會。因此,如果 log_durationonlog_min_duration_statement 具有正值,則會記錄所有持續時間,但僅包含超過閾值的語句的查詢文字。此行為可用於在高負載安裝中收集統計資訊。

log_error_verbosity (enum) #

控制寫入伺服器日誌的詳細程度,適用於每個記錄的訊息。有效值為 TERSEDEFAULTVERBOSE,每個值都會在顯示的訊息中增加更多欄位。TERSE 排除記錄 DETAILHINTQUERYCONTEXT 錯誤資訊。VERBOSE 輸出包含 SQLSTATE 錯誤代碼 (另請參閱附錄 A) 以及產生錯誤的原始碼檔案名稱、函式名稱和行號。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_hostname (boolean) #

預設情況下,連線日誌訊息只會顯示連線主機的 IP 位址。啟用此參數也會記錄主機名稱。請注意,根據您的主機名稱解析設定,這可能會導致相當大的效能損失。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

log_line_prefix (string) #

這是一個 printf 風格的字串,會在每個日誌行的開頭輸出。% 字元開始 跳脫序列,這些序列會被替換為如下所述的狀態資訊。無法識別的跳脫序列將被忽略。其他字元會直接複製到日誌行。某些跳脫序列只能由會話程序識別,並且會被主伺服器程序等背景程序視為空值。狀態資訊可以通過在 % 之後和選項之前指定一個數字常值來左對齊或右對齊。負值將導致狀態資訊在右側用空格填充以給予其最小寬度,而正值將在左側填充。填充對於幫助人類閱讀日誌文件很有用。

此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。預設值為 '%m [%p] ',它會記錄時間戳記和程序 ID。

跳脫字元 效果 僅限會話
%a 應用程式名稱
%u 使用者名稱
%d 資料庫名稱
%r 遠端主機名稱或 IP 位址,以及遠端端口
%h 遠端主機名稱或 IP 位址
%b 後端類型
%p 程序 ID
%P 並行群組領導者的程序 ID,如果此程序是並行查詢工作程序
%t 沒有毫秒的時間戳記
%m 具有毫秒的時間戳記
%n 具有毫秒的時間戳記 (作為 Unix epoch)
%i 命令標籤:會話目前命令的類型
%e SQLSTATE 錯誤代碼
%c 會話 ID:請參閱下文
%l 每個會話或程序的日誌行號,從 1 開始
%s 程序開始時間戳記
%v 虛擬交易 ID (procNumber/localXID);請參閱第 66.1 節
%x 交易 ID (如果未指定,則為 0);請參閱第 66.1 節
%q 不產生任何輸出,但告訴非會話程序在此字串中停止;會話程序忽略
%Q 目前查詢的查詢識別碼。 預設情況下不計算查詢識別碼,因此除非啟用compute_query_id參數或配置了計算查詢識別碼的第三方模組,否則此欄位將為零。
%% 文字 %

後端類型對應於視圖 pg_stat_activity 中的欄位 backend_type,但日誌中可能會出現該視圖中未顯示的其他類型。

%c 跳脫字元會列印一個近似唯一的會話識別碼,由兩個以點分隔的 4 位元組十六進位數字(不含前導零)組成。這些數字是程序啟動時間和程序 ID,因此 %c 也可以用作節省空間的方式來列印這些項目。例如,要從 pg_stat_activity 產生會話識別碼,請使用以下查詢

SELECT to_hex(trunc(EXTRACT(EPOCH FROM backend_start))::integer) || '.' ||
       to_hex(pid)
FROM pg_stat_activity;

提示

如果您為 log_line_prefix 設定了非空值,則通常應將其最後一個字元設為空格,以便與日誌行的其餘部分提供視覺分離。也可以使用標點符號。

提示

Syslog 會產生自己的時間戳記和程序 ID 資訊,因此如果您要記錄到 syslog,您可能不想包含這些跳脫字元。

提示

當包含僅在會話(後端)上下文中可用的資訊(如使用者或資料庫名稱)時,%q 跳脫字元很有用。例如

log_line_prefix = '%m [%p] %q%u@%d/%a '

注意

由於 log_statement 在可以計算識別碼之前產生輸出,包括無法計算識別碼的無效語句,因此 %Q 跳脫字元始終報告 log_statement 輸出的行的零識別碼。

log_lock_waits (boolean) #

控制當會話等待超過 deadlock_timeout 時間以取得鎖定時,是否產生日誌訊息。這有助於確定鎖定等待是否導致效能不佳。預設值為 off。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_recovery_conflict_waits (boolean) #

控制當啟動程序等待恢復衝突的時間超過 deadlock_timeout 時,是否產生日誌訊息。這有助於確定恢復衝突是否阻止恢復應用 WAL。

預設值為 off。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

log_parameter_max_length (integer) #

若大於零,則使用非錯誤陳述式記錄訊息記錄的每個繫結參數值都會被截斷至此位元組數。零會停用非錯誤陳述式日誌的繫結參數記錄。-1 (預設值) 允許完整記錄繫結參數。如果此值在沒有指定單位的情況下指定,則將其視為位元組。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

此設定僅影響因 log_statementlog_duration 和相關設定而列印的日誌訊息。此設定的非零值會增加一些額外負荷,特別是當參數以二進位形式傳送時,因為那時需要轉換為文字。

log_parameter_max_length_on_error (integer) #

若大於零,則在錯誤訊息中報告的每個繫結參數值都會被截斷至此位元組數。零(預設值)會停用在錯誤訊息中包含繫結參數。-1 允許完整列印繫結參數。如果此值在沒有指定單位的情況下指定,則將其視為位元組。

此設定的非零值會增加額外負荷,因為 PostgreSQL 需要在每個陳述式開始時將參數值的文字表示形式儲存在記憶體中,無論最終是否發生錯誤。當繫結參數以二進位形式傳送時,額外負荷會大於以文字形式傳送時,因為前者需要資料轉換,而後者僅需要複製字串。

log_statement (enum) #

控制記錄哪些 SQL 陳述式。有效值為 none(關閉)、ddlmodall(所有陳述式)。ddl 記錄所有資料定義陳述式,例如 CREATEALTERDROP 陳述式。mod 記錄所有 ddl 陳述式,加上資料修改陳述式,例如 INSERTUPDATEDELETETRUNCATECOPY FROM。如果 PREPAREEXECUTEEXPLAIN ANALYZE 陳述式所包含的指令是適當類型,也會記錄這些陳述式。對於使用擴充查詢協定的用戶端,當收到 Execute 訊息時會進行記錄,並且包含 Bind 參數的值(任何嵌入的單引號標記都會加倍)。

預設值為 none。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

注意

即使 log_statement = all 設定,包含簡單語法錯誤的陳述式也不會被記錄,因為日誌訊息僅在完成基本剖析以判斷陳述式類型後才會發出。在使用擴充查詢協定的情況下,此設定同樣不會記錄在 Execute 階段之前失敗的陳述式(即,在剖析分析或規劃期間)。將 log_min_error_statement 設定為 ERROR(或更低)以記錄此類陳述式。

記錄的陳述式可能會揭露敏感資料,甚至包含純文字密碼。

log_replication_commands (boolean) #

導致每個複寫指令和 walsender 程序的複寫槽取得/釋放記錄在伺服器日誌中。有關複寫指令的更多資訊,請參閱 第 53.4 節。預設值為 off。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_temp_files (integer) #

控制臨時檔案名稱和大小的記錄。可以為排序、雜湊和臨時查詢結果建立臨時檔案。如果此設定啟用,則會為每個臨時檔案發出一個日誌條目,其中檔案大小以位元組為單位指定,並在刪除時。零值記錄所有臨時檔案資訊,而正值僅記錄大小大於或等於指定資料量的檔案。如果此值在沒有指定單位的情況下指定,則將其視為 KB。預設設定為 -1,這會停用此類記錄。只有超級使用者和具有適當 SET 權限的使用者才能變更此設定。

log_timezone (string) #

設定用於寫入伺服器日誌中的時間戳記的時區。與 TimeZone 不同,此值是叢集範圍的,因此所有工作階段都會一致地報告時間戳記。內建的預設值為 GMT,但通常在 postgresql.conf 中會覆寫它;initdb 將在那裡安裝一個對應於其系統環境的設定。有關更多資訊,請參閱 第 8.5.3 節。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

19.8.4. 使用 CSV 格式的日誌輸出 #

log_destination 列表中包含 csvlog 提供了一種將日誌檔案匯入資料庫表格的便捷方法。此選項以逗號分隔值 (CSV) 格式發出日誌行,包含以下欄位:帶毫秒的時間戳記、使用者名稱、資料庫名稱、程序 ID、用戶端主機:埠號、工作階段 ID、每個工作階段的行號、指令標籤、工作階段開始時間、虛擬交易 ID、正規交易 ID、錯誤嚴重性、SQLSTATE 代碼、錯誤訊息、錯誤訊息詳細資訊、提示、導致錯誤的內部查詢 (如果有的話)、其中錯誤位置的字元計數、錯誤上下文、導致錯誤的使用者查詢 (如果有的話,並且由 log_min_error_statement 啟用)、其中錯誤位置的字元計數、錯誤在 PostgreSQL 原始碼中的位置 (如果 log_error_verbosity 設定為 verbose)、應用程式名稱、後端類型、並行群組領導者的程序 ID 和查詢 ID。以下是用於儲存 CSV 格式日誌輸出的範例表格定義

CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  backend_type text,
  leader_pid integer,
  query_id bigint,
  PRIMARY KEY (session_id, session_line_num)
);

要將日誌檔案匯入此表格,請使用 COPY FROM 指令

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

也可以使用提供的 file_fdw 模組,以外部表格的形式存取該檔案。

您需要執行一些操作來簡化匯入 CSV 日誌檔案

  1. 設定 log_filenamelog_rotation_age,為您的日誌檔案提供一致且可預測的命名方案。這讓您可以預測檔案名稱,並知道個別的日誌檔案何時完成,因此可以匯入。

  2. log_rotation_size 設定為 0,以停用基於大小的日誌輪替,因為這會使日誌檔案名稱難以預測。

  3. log_truncate_on_rotation 設定為 on,以避免舊的日誌資料與新的資料混合在同一個檔案中。

  4. 上面的資料表定義包含主鍵規範。 這有助於防止意外地匯入相同資訊兩次。COPY 命令一次提交它匯入的所有資料,因此任何錯誤都會導致整個匯入失敗。 如果您匯入部分日誌檔案,然後在檔案完成後再次匯入該檔案,則主鍵衝突將導致匯入失敗。 請等到日誌完成並關閉後再匯入。 此程序還可以防止意外匯入尚未完全寫入的部分行,這也會導致 COPY 失敗。

19.8.5. 使用 JSON 格式的日誌輸出 #

log_destination 列表中包含 jsonlog 提供了一種方便的方式,可將日誌檔案匯入許多不同的程式。此選項會發出以下格式的日誌行JSON格式。

具有空值的字串欄位將從輸出中排除。將來可能會添加其他欄位。處理 jsonlog 輸出的使用者應用程式應忽略未知的欄位。

每個日誌行都會序列化為一個 JSON 物件,其中包含一組鍵及其關聯值,如 表 19.3 所示。

表 19.3. JSON 日誌條目的鍵和值

鍵名 類型 說明
timestamp 字串 具有毫秒的時間戳記
user 字串 使用者名稱
dbname 字串 資料庫名稱
pid 數字 程序 ID
remote_host 字串 客戶端主機
remote_port 數字 客戶端埠
session_id 字串 會話 ID
line_num 數字 每個會話的行號
ps 字串 目前的 ps 顯示
session_start 字串 會話開始時間
vxid 字串 虛擬交易 ID
txid 字串 一般交易 ID
error_severity 字串 錯誤嚴重性
state_code 字串 SQLSTATE 程式碼
message 字串 錯誤訊息
detail 字串 錯誤訊息詳細資訊
hint 字串 錯誤訊息提示
internal_query 字串 導致錯誤的內部查詢
internal_position 數字 游標索引到內部查詢中
context 字串 錯誤上下文
statement 字串 客戶端提供的查詢字串
cursor_position 數字 游標索引到查詢字串中
func_name 字串 錯誤位置函數名稱
file_name 字串 錯誤位置的檔案名稱
file_line_num 數字 錯誤位置的檔案行號
application_name 字串 客戶端應用程式名稱
backend_type 字串 後端的類型
leader_pid 數字 活動並行工作進程的領導進程 ID
query_id 數字 查詢 ID

19.8.6. 進程標題 #

這些設定控制伺服器進程的進程標題如何被修改。 進程標題通常使用諸如 ps 之類的程式或 Windows 上的 Process Explorer 來檢視。 有關詳細資訊,請參閱 Section 27.1

cluster_name (string) #

設定一個名稱,用於識別此資料庫叢集(例項)以用於各種目的。 叢集名稱會出現在此叢集中所有伺服器進程的進程標題中。 此外,它是備用連線的預設應用程式名稱(請參閱 synchronous_standby_names。)

該名稱可以是小於 NAMEDATALEN 個字元的任何字串(在標準版本中為 64 個字元)。 只有可列印的 ASCII 字元可以用於 cluster_name 值中。 其他字元將替換為 C 樣式十六進制跳脫字元。 如果此參數設定為空字串 ''(這是預設值),則不顯示名稱。 此參數只能在伺服器啟動時設定。

update_process_title (boolean) #

允許每次伺服器收到新的 SQL 命令時更新進程標題。 在大多數平台上,此設定預設為 on,但由於該平台更新進程標題的開銷較大,因此在 Windows 上預設為 off。 只有超級使用者和具有適當 SET 權限的使用者才能更改此設定。

提交更正

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