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

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

19.8.1. 記錄位置 #

log_destination (string) #

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

如果 csvlog 包含在 log_destination 中,日誌條目將以 逗號分隔值 (CSV) 格式輸出,便於將日誌載入到程式中。有關詳細資訊,請參見 第 19.8.4 節。要生成 CSV 格式的日誌輸出,必須啟用 logging_collector

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

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 可以記錄到 syslogLOCAL0LOCAL7(參見 syslog_facility),但大多數平臺上的預設 syslog 配置會丟棄所有此類訊息。您需要將類似以下內容新增到 syslog 守護程序的配置檔案中,才能使其正常工作:

local0.*    /var/log/postgresql

以使其工作。

在 Windows 上,當您為 log_destination 使用 eventlog 選項時,您應該向作業系統註冊一個事件源及其庫,以便 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 截斷(覆蓋)同名的現有日誌檔案,而不是追加。但是,只有在由於基於時間的輪換而開啟新檔案時才會發生截斷,在伺服器啟動或基於大小的輪換時不會。當停用時,所有情況都會追加到預先存在的日誌檔案中。例如,使用此設定並結合 log_filenamepostgresql-%H.log,將生成 24 個小時日誌檔案,然後迴圈覆蓋它們。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

示例:要保留 7 天的日誌,每天一個日誌檔案,命名為 server_log.Monserver_log.Tue 等,並自動用本週的日誌覆蓋上週的日誌,請將 log_filename 設定為 server_log.%a,將 log_truncate_on_rotation 設定為 on,並將 log_rotation_age 設定為 1440

示例:要保留 24 小時的日誌,每小時一個日誌檔案,但如果日誌檔案大小超過 1GB,則會提前輪換,請將 log_filename 設定為 server_log.%H%M,將 log_truncate_on_rotation 設定為 on,將 log_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 時,此引數決定用於在 syslog 日誌中標識 PostgreSQL 訊息的程式名。預設是 postgres。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

syslog_sequence_numbers (boolean) #

當記錄到 syslog 且此項為 on(預設值)時,每條訊息都會以遞增的序列號(例如 [2])作為字首。這可以繞過許多 syslog 實現預設執行的“--- 上一條訊息重複 N 次 ---”抑制。在更現代的 syslog 實現中,可以配置重複訊息抑制(例如 rsyslog 中的 $RepeatedMsgReduction),因此這可能不是必需的。此外,如果您確實希望抑制重複的訊息,可以將其關閉。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

syslog_split_messages (boolean) #

當啟用記錄到 syslog 時,此引數決定訊息如何傳遞給 syslog。當啟用(預設值)時,訊息按行分割,長行會被分割以適應 1024 位元組,這是傳統 syslog 實現的典型大小限制。當停用時,PostgreSQL 伺服器日誌訊息按原樣傳遞給 syslog 服務,由 syslog 服務來處理可能存在的超大訊息。

如果 syslog 最終記錄到一個文字檔案,那麼無論哪種方式效果都相同,最好保持該設定啟用,因為大多數 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
ERROR 報告導致當前命令中止的錯誤。 WARNING ERROR
LOG 報告對管理員有用的資訊,例如,檢查點活動。 INFO INFORMATION
FATAL 報告導致當前會話中止的錯誤。 ERR ERROR
PANIC 報告導致所有資料庫會話中止的錯誤。 CRIT ERROR

19.8.3. 記錄什麼內容 #

注意

您選擇記錄的內容可能具有安全影響;請參見 第 24.3 節

application_name (string) #

application_name 可以是小於 NAMEDATALEN 字元(標準構建中為 64 個字元)的任何字串。它通常由應用程式連線伺服器時設定。該名稱將顯示在 pg_stat_activity 檢視中,幷包含在 CSV 日誌條目中。它也可以透過 log_line_prefix 引數包含在常規日誌條目中。 application_name 值中只能使用可列印的 ASCII 字元。其他字元將被替換為 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 (string) #

導致記錄伺服器的每次連線的各個方面。預設是空字串 '',這會停用所有連線日誌記錄。可以單獨或以逗號分隔的列表指定以下選項:

表 19.3. 連線日誌選項

名稱 描述
receipt 記錄連線的接收。
authentication 記錄身份驗證方法用於標識使用者的原始身份。在大多數情況下,身份字串與 PostgreSQL 使用者名稱匹配,但某些第三方身份驗證方法可能會在伺服器儲存之前更改原始使用者識別符號。失敗的身份驗證始終會被記錄,無論此設定的值如何。
authorization 記錄授權成功的完成。此時連線已建立,但後端尚未完全設定。日誌訊息包括授權的使用者名稱以及資料庫名稱和應用程式名稱(如果適用)。
setup_durations 記錄建立連線和設定後端直到連線準備好執行第一個查詢所花費的時間。日誌訊息包括三個持續時間:總設定持續時間(從 postmaster 接受傳入連線開始,到連線準備好執行查詢為止)、分叉新後端的耗時以及使用者身份驗證的耗時。
all 一個方便的別名,相當於指定所有選項。如果 all 在其他選項列表中指定,則會記錄所有連線方面。

斷開連線的日誌記錄由 log_disconnections 單獨控制。

為了向後相容,onofftruefalseyesno10 仍然受支援。正值等同於指定 receiptauthenticationauthorization 選項。

只有超級使用者和具有相應 SET 許可權的使用者可以在會話開始時更改此引數,並且不能在會話內更改。

注意

某些客戶端程式,例如 psql,在確定是否需要密碼時會嘗試連線兩次,因此重複的“connection received”訊息不一定表示有問題。

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 地址
%L 本地地址(客戶端連線到的伺服器上的 IP 地址)
%b 後端型別
%p 程序 ID
%P 並行組的 leader 程序 ID,如果該程序是並行查詢工作程序。
%t 不帶毫秒的時間戳
%m 帶毫秒的時間戳
%n 帶毫秒的時間戳(作為 Unix epoch)
%i 命令標籤:當前會話命令的型別
%e SQLSTATE 錯誤程式碼
%c 會話 ID:見下文
%l 每個會話或程序的日誌行號,從 1 開始
%s 程序啟動時間戳
%v 虛擬事務 ID (procNumber/localXID);參見 第 67.1 節
%x 事務 ID(如果沒有分配則為 0);參見 第 67.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 '

注意

%Q 轉義對於由 log_statement 輸出的行始終報告零識別符號,因為 log_statement 在可以計算識別符號之前生成輸出,包括無法計算識別符號的無效語句。

log_lock_waits (boolean) #

控制當會話等待鎖的時間超過 deadlock_timeout 來獲取鎖時是否生成日誌訊息。這對於確定鎖等待是否導致效能下降很有用。預設是 off。只有超級使用者和具有相應 SET 許可權的使用者才能更改此設定。

log_lock_failures (boolean) #

控制當鎖獲取失敗時是否生成詳細的日誌訊息。這對於分析鎖失敗的原因很有用。目前,僅支援由於 SELECT NOWAIT 導致的鎖失敗。預設是 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 程序的複製槽獲取/釋放。有關複製命令的更多資訊,請參見 第 54.4 節。預設值為 off。只有超級使用者和具有相應 SET 許可權的使用者才能更改此設定。

log_temp_files (integer) #

控制臨時檔名稱和大小的記錄。臨時檔案可能用於排序、雜湊和臨時查詢結果。如果透過此設定啟用,則在刪除每個臨時檔案時,會發出一個包含檔案大小(以位元組為單位)的日誌條目。值為零會記錄所有臨時檔案資訊,而正值僅記錄大小大於或等於指定資料量(以千位元組為單位)的檔案。如果此值未指定單位,則假定為千位元組。預設設定是 -1,這會停用此類日誌記錄。只有超級使用者和具有相應 SET 許可權的使用者才能更改此設定。

log_timezone (string) #

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

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

csvlog 包含在 log_destination 列表中,提供了一種方便的方式將日誌檔案匯入資料庫表。此選項以逗號分隔值(CSV)格式發出日誌行,包含以下列:帶毫秒的時間戳、使用者名稱、資料庫名、程序 ID、客戶端主機:埠號、會話 ID、每個會話的行號、命令標籤、會話開始時間、虛擬事務 ID、常規事務 ID、錯誤嚴重性、SQLSTATE 程式碼、錯誤訊息、錯誤訊息詳情、提示、導致錯誤的內部查詢(如果有)、其中錯誤位置的字元數、錯誤上下文、導致錯誤的查詢(如果有且由 log_min_error_statement 啟用)、其中錯誤位置的字元數、PostgreSQL 原始碼中錯誤的位置(如果 log_error_verbosity 設定為 verbose)、應用程式名稱、後端型別、並行組 leader 的程序 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 格式的日誌輸出 #

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

值為 null 的字串欄位將從輸出中排除。將來可能會新增其他欄位。處理 jsonlog 輸出的使用者應用程式應忽略未知欄位。

每行日誌將被序列化為一個 JSON 物件,其中包含 表 19.4 中顯示的鍵集及其關聯的值。

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

鍵名 型別 描述
timestamp string 帶毫秒的時間戳
user string 使用者名稱
dbname string 資料庫名稱
pid number 程序 ID
remote_host string 客戶端主機
remote_port number 客戶端埠
session_id string 會話 ID
line_num number 每個會話的行號
ps string 當前 ps 顯示
session_start string 會話開始時間
vxid string 虛擬事務 ID
txid string 常規事務 ID
error_severity string 錯誤嚴重性
state_code string SQLSTATE 程式碼
message string 錯誤訊息
detail string 錯誤訊息詳情
hint string 錯誤訊息提示
internal_query string 導致錯誤的內部查詢
internal_position number 內部查詢中的遊標索引
context string 錯誤上下文
statement string 客戶端提供的查詢字串
cursor_position number 查詢字串中的遊標索引
func_name string 錯誤位置函式名
file_name string 錯誤位置的檔名
file_line_num number 錯誤位置的檔案行號
application_name string 客戶端應用程式名稱
backend_type string 後端型別
leader_pid number 活動並行工作程序的 leader 程序 ID
query_id number 查詢 ID

19.8.6. 程序標題 #

這些設定控制伺服器程序的程序標題如何被修改。程序標題通常使用 ps 等程式檢視,或在 Windows 上使用 Process Explorer 檢視。有關詳細資訊,請參見 第 27.1 節

cluster_name (string) #

設定一個名稱,用於標識此資料庫叢集(例項)的各種用途。叢集名稱會顯示在此叢集所有伺服器程序的程序標題中。此外,它還是備用連線的預設應用程式名稱(參見 synchronous_standby_names)。

該名稱可以是小於 NAMEDATALEN 字元(標準構建中為 64 個字元)的任何字串。 cluster_name 值中只能使用可列印的 ASCII 字元。其他字元將被替換為 C 風格的十六進位制轉義。如果此引數設定為空字串 ''(這是預設值),則不顯示名稱。此引數只能在伺服器啟動時設定。

update_process_title (boolean) #

每次伺服器收到新的 SQL 命令時,都會啟用程序標題的更新。此設定在大多數平臺上預設為 on,但在 Windows 上預設為 off,因為該平臺更新程序標題的開銷較大。只有超級使用者和具有相應 SET 許可權的使用者才能更改此設定。

提交更正

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