PostgreSQL 錯誤報告和日志

2021-08-31 13:59 更新
19.8.1. 在哪里做日志
19.8.2. 什么時候記錄日志
19.8.3. 記錄什么到日志
19.8.4. 使用 CSV 格式的日志輸出
19.8.5. 進程標題

19.8.1. 在哪里做日志

log_destination (string)

PostgreSQL支持多種方法來記錄服務器消息,包括stderr、csvlogsyslog。在 Windows 上還支持eventlog。設置這個參數(shù)為一個由想要的日志目的地的列表,之間用逗號分隔。默認值是只記錄到 stderr。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

如果csvlog被包括在log_destination中,日志項會以逗號分隔值CSV)格式被輸出,這樣可以很方便地把日志載入到程序中。詳見本文中第 19.8.4 節(jié)。要產(chǎn)生 CSV 格式的日志輸出,必須啟用?logging_collector?。

當包括有stderrcsvlog時,會創(chuàng)建文件current_logfiles來記錄當前正在被日志收集器使用的日志文件的位置以及相關的日志目的地。這提供了一種查找實例當前使用的日志的便利手段。這里是該文件內容的一個例子:

stderr log/postgresql.log
csvlog log/postgresql.csv

當由于輪轉效應創(chuàng)建一個新的日志文件時以及log_destination被重載時,current_logfiles文件會被重建。當log_destination中不包括stderrcsvlog時以及當日志收集器被禁用時,這個文件會被刪除。

注意

在大多數(shù) Unix 系統(tǒng)上,你將需要修改系統(tǒng)的syslog守護進程的配置來使用log_destinationsyslog選項。PostgreSQL可以在syslog設備 LOCAL0LOCAL7中記錄(見?syslog_facility?),但是大部分平臺上的默認syslog配置會丟棄所有這種消息。你將需要增加這樣的內容:

local0.*    /var/log/postgresql

syslog守護進程的配置文件來讓它工作。

在 Windows 上,當你使用log_destinationeventlog選項時,你應該在操作系統(tǒng)中注冊一個事件源極其庫,這樣 Windows 事件查看器能夠清楚地顯示事件日志消息。詳見第 18.12 節(jié)。

logging_collector (boolean)

這個參數(shù)啟用日志收集器,它是一個捕捉被發(fā)送到stderr的日志消息的后臺進程,并且它會將這些消息重定向到日志文件中。這種方法比記錄到syslog通常更有用,因為某些類型的消息不會在syslog輸出中出現(xiàn)(一個常見的例子是動態(tài)鏈接器錯誤消息;另一個例子是由 archive_command等腳本產(chǎn)生的錯誤消息)。這個參數(shù)只能在服務器啟動時設置。

注意

也可以不使用日志收集器而把日志記錄到stderr,日志消息將只會去到服務器的stderr被定向到的位置。不過,那種方法只適合于低日志量,因為它沒有提供方法來輪轉日志文件。還有,在某些不使用日志收集器的平臺上可能會導致丟失或者混淆日志輸出,因為多個進程并發(fā)寫入同一個日志文件時會覆蓋彼此的輸出。

注意

日志收集器被設計成從來不會丟失消息。這意味著在極高的負載下,如果服務器進程試圖在收集器已經(jīng)落后時發(fā)送更多的日志消息,那么它會被阻塞。相反,syslog傾向于在無法寫入消息時丟掉消息,這意味著在這樣的情況下它可能會無法記錄某些消息,但是它不會阻塞系統(tǒng)的其他部分。

log_directory (string)

logging_collector被啟用時,這個參數(shù)決定日志文件將被在哪個目錄下創(chuàng)建。它可以被指定為一個絕對路徑,也可以被指定為一個相對于集簇數(shù)據(jù)目錄的相對路徑。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。 默認是log。

log_filename (string)

logging_collector被啟用時,這個參數(shù)設置被創(chuàng)建的日志文件的文件名。 該值被視為一種strftime模式,因此%轉義可以被用來指定根據(jù)時間變化的文件名(注意如果有任何時區(qū)獨立的%轉義,計算將在由?log_timezone?指定的時區(qū)中完成)。 被支持的%轉義和開放組織的strftime說明中列舉的類似。 注意系統(tǒng)的strftime不會被直接使用,因此平臺相關(非標準)的擴展無法工作。 默認是 postgresql-%Y-%m-%d_%H%M%S.log。

如果你不使用轉義來指定一個文件名,你應該計劃使用一個日志輪轉工具來避免最終填滿整個磁盤。在 8.4 發(fā)行之前,如果不存在%轉義,PostgreSQL將追加新日志文件創(chuàng)建時間的紀元,但是現(xiàn)在已經(jīng)不再這樣做了。

如果在log_destination中啟用了 CSV 格式輸出,.csv將會被追加到時間戳日志文件名中來創(chuàng)建 CSV 格式輸出(如果log_filename.log結尾,該后綴會被替換)。

這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

log_file_mode (integer)

在 Unix 系統(tǒng)上,當logging_collector被啟用時,這個參數(shù)設置日志文件的權限(在微軟 Windows 上這個參數(shù)將被忽略)。這個參數(shù)值應當是一個數(shù)字形式的模式,它可以被chmodumask系統(tǒng)調用接受(要使用通常的十進制格式,該數(shù)字必須以一個0(零)開始)。

默認的權限是0600,表示只有服務器擁有者才能讀取或寫入日志文件。其他常用的設置是0640,它允許擁有者的組成員讀取文件。不過要注意你需要修改?log_directory?為將文件存儲在集簇數(shù)據(jù)目錄之外的某個位置,才能利用這個設置。在任何情況下,讓日志文件變成任何人都可讀是不明智的,因為日志文件中可能包含敏感數(shù)據(jù)。

這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

log_rotation_age (integer)

logging_collector被啟用時,這個參數(shù)決定使用一個單個日志文件的最大時間量,之后將創(chuàng)立一個新的日志文件。 如果指定值時沒有單位,則以分鐘為單位。默認為24小時。 將這個參數(shù)設置為零將禁用基于時間的新日志文件創(chuàng)建。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

log_rotation_size (integer)

logging_collector被啟用時,這個參數(shù)決定一個個體日志文件的最大尺寸。 當這些數(shù)據(jù)量被發(fā)送到一個日志文件后,將創(chuàng)建一個新的日志文件。 如果指定值的時候沒有單位,則以千字節(jié)為單位。默認值是10兆字節(jié)。設置為零時將禁用基于大小創(chuàng)建新的日志文件。 這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

log_truncate_on_rotation (boolean)

logging_collector被啟用時,這個參數(shù)將導致PostgreSQL截斷(覆蓋而不是追加)任何已有的同名日志文件。不過,截斷只在一個新文件由于基于時間的輪轉被打開時發(fā)生,在服務器啟動或基于尺寸的輪轉時不會發(fā)生。如果被關閉,在所有情況下以前存在的文件將被追加。例如,使用這個設置和一個類似postgresql-%H.loglog_filename將導致產(chǎn)生 24 個每小時的日志文件,并且循環(huán)地覆蓋它們。這個參數(shù)只能在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允許發(fā)生任何尺寸驅動的輪轉來選擇一個不同于每個小時的初始文件名的新文件名。

syslog_facility (enum)

當啟用了向syslog記錄時,這個參數(shù)決定要使用的syslog設備。你可以在LOCAL0、LOCAL1、LOCAL2、 LOCAL3、LOCAL4、 LOCAL5LOCAL6、LOCAL7中選擇,默認值是LOCAL0。還請參閱系統(tǒng)的syslog守護進程的文檔。這個參數(shù)只能在 postgresql.conf文件中或在服務器命令行上設置。

syslog_ident (string)

當啟用了向syslog記錄時,這個參數(shù)決定用來標識syslog中的PostgreSQL消息的程序名。默認值是postgres。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

syslog_sequence_numbers (boolean)

當日志被記錄到syslog并且這個設置為 on (默認)時,每一個消息會被加上一個增長的序號作為前綴(例如[2])。這種行為避開了很多 syslog 實現(xiàn)默認采用的--- 上一個消息重復 N 次 ---形式。在現(xiàn)代 syslog 實現(xiàn)中,抑制重復消息是可以配置的(例如 rsyslog中的$RepeatedMsgReduction),因此這個參數(shù)可能不是必需的。此外,如果你真的想抑制重復消息,你可以把這個參數(shù)設置為 off。

這個參數(shù)只能在postgresql.conf文件或者服務器命令行上設置。

syslog_split_messages (boolean)

當啟用把日志記錄到syslog時,這個參數(shù)決定消息如何送達 syslog。當設置為 on(默認)時,消息會被分成行,并且長的行也會被劃分以便能夠放到 1024 字節(jié)中,這是傳統(tǒng) syslog 實現(xiàn)一種典型的尺寸限制。當設置為 off 時,PostgreSQL 服務器日志消息會被原樣送達 syslog 服務,而處理可能的大體量消息的任務由 syslog 服務負責。

如果 syslog 最終被記錄到一個文本文件中,那么兩種設置的效果是一樣的,但最好設置為 on,因為大部分 syslog 實現(xiàn)要么不能處理大型消息,要么需要做特殊的配置以處理大型消息。但是如果 syslog 最終寫入到某種其他媒介,有必要讓消息保持邏輯上的整體性(也更加有用)。

這個參數(shù)只能在postgresql.conf文件或者服務器命令行上設置。

event_source (string)

當啟用了向事件日志記錄時,這個參數(shù)決定用來標識日志中PostgreSQL消息的程序名。默認值是PostgreSQL。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

19.8.2. 什么時候記錄日志

log_min_messages (enum)

控制哪些消息級別(本文中表19.2 消息嚴重級別中可以查閱) 被寫入到服務器日志。有效值是DEBUG5、DEBUG4、 DEBUG3DEBUG2、DEBUG1、 INFONOTICE、WARNING、 ERROR、LOGFATALPANIC。每個級別都包括以后的所有級別。級別越靠后,被發(fā)送的消息越少。默認值是WARNING。注意LOG在這里有與client_min_messages中不同的排名。只有超級用戶可以改變這個設置。

log_min_error_statement (enum)

控制哪些導致一個錯誤情況的 SQL 語句被記錄在服務器日志中。任何指定 嚴重級別(本文中表19.2 消息嚴重級別中可以查閱) 或更高級別的消息的當前 SQL 語句將被包括在日志項中。有效值是DEBUG5、 DEBUG4、 DEBUG3DEBUG2、DEBUG1、 INFONOTICE、 WARNINGERROR、 LOG、 FATALPANIC。默認值是ERROR,它表示導致錯誤、日志消息、致命錯誤或恐慌錯誤的語句將被記錄在日志中。要有效地關閉記錄失敗語句,將這個參數(shù)設置為PANIC。只有超級用戶可以改變這個設置。

log_min_duration_statement (integer)

如果語句運行至少指定的時間量,將導致記錄每一個這種完成的語句的持續(xù)時間。 例如,如果你設置它為250ms,那么所有運行 250ms 或更久的 SQL 語句將被記錄。 啟用這個參數(shù)可以有助于追蹤應用中未優(yōu)化的查詢。如果指定值時沒有單位,則以毫秒為單位。將這個參數(shù)設置為零將打印所有語句的執(zhí)行時間。 設置為 -1(默認值)將停止記錄語句持續(xù)時間。只有超級用戶可以改變這個設置。

這會覆蓋?log_min_duration_sample?,意味著持續(xù)時間超過此設置的查詢不進行抽樣,并且始終被記錄。

對于使用擴展查詢協(xié)議的客戶端,解析、綁定和執(zhí)行步驟的持續(xù)時間將被獨立記錄。

注意

當把這個選項和?log_statement?一起使用時,已經(jīng)被log_statement記錄的語句文本不會在持續(xù)時間日志消息中重復。如果你沒有使用syslog,我們推薦你使用?log_line_prefix?記錄 PID 或會話 ID,這樣你可以使用進程 ID 或會話 ID 把語句消息鏈接到后來的持續(xù)時間消息。

log_min_duration_sample (integer)

允許對最少運行了指定時間的已完成語句的持續(xù)時間進行抽樣。 這將生成與?log_min_duration_statement ?相同的日志條目,但僅適用于已執(zhí)行語句的子集,采樣率由 ?log_statement_sample_rate ?控制。 例如,如果將它設置為 100ms則所有運行 100ms 或更長的 SQL 語句都將被采樣。 當流量過高而無法記錄所有查詢時,啟用此參數(shù)會很有幫助。如果指定此值時沒有單位,則以毫秒為單位。 設置為零將采樣所有語句持續(xù)時間。-1(默認值)禁用采樣語句持續(xù)時間。只有超級用戶可以更改此設置。

此設置的優(yōu)先級低于 log_min_duration_statement,意味著持續(xù)時間超過 log_min_duration_statement 的語句不被采樣,并且始終被記錄。

log_min_duration_statement的其他注釋也適用于此設置。

log_statement_sample_rate (floating point)

確定持續(xù)時間超過 ?log_min_duration_sample?的語句的部分。 采樣是隨機的,例如0.5意味著從統(tǒng)計學上講,任何給定語句都有1/2的概率將被記錄。 默認值為 1.0,意味著要記錄所有采樣語句。 設置為零將禁用采樣語句持續(xù)時間日志,與將 log_min_duration_sample設為 -1 相同。 只有超級用戶可以更改此設置。

log_transaction_sample_rate (floating point)

設置所有語句都被記錄的交易的部分,以及由于其他原因而記錄的語句。它適用于每個新事務,而不考慮其語句的持續(xù)時間。 采樣是隨機的,例如 0.1意味著從統(tǒng)計學上講,任何給定事務都有十分之一的機會將被記錄。 log_transaction_sample_rate 有助于構建一個事務示例. 默認值為 0,表示不記錄任何額外事務的語句。 設置這個為 1將記錄所有交易的所有語句。只有超級用戶可以更改此設置。

注意

就像所有的語句-日志選項一樣,這個選項可能會增加大量開銷。

表 19.2解釋了PostgreSQL所使用的消息嚴重級別。如果日志輸出被發(fā)送到syslog或 Windows 的 eventlog,嚴重級別會按照表中所示進行轉換。

表 19.2. 消息嚴重級別

嚴重性 用法 syslog eventlog
DEBUG1 .. DEBUG5 為開發(fā)者提供連續(xù)的更詳細的信息。 DEBUG INFORMATION
INFO 提供用戶隱式要求的信息,例如來自VACUUM VERBOSE的輸出。 INFO INFORMATION
NOTICE 提供可能對用戶有用的信息,例如長標識符截斷提示。 NOTICE INFORMATION
WARNING 提供可能出現(xiàn)的問題的警告,例如在一個事務塊外COMMIT。 NOTICE WARNING
ERROR 報告一個導致當前命令中斷的錯誤。 WARNING ERROR
LOG 報告管理員可能感興趣的信息,例如檢查點活動。 INFO INFORMATION
FATAL 報告一個導致當前會話中斷的錯誤。 ERR ERROR
PANIC 報告一個導致所有數(shù)據(jù)庫會話中斷的錯誤。 CRIT ERROR

19.8.3. 記錄什么到日志

application_name (string)

application_name可以是任意小于NAMEDATALEN個字符(標準編譯中是 64 個字符)的字符串。這通常由一個應用通過到服務器的連接設置。該名稱將被顯示在pg_stat_activity視圖中并被包括在 CSV 日志項中。它也會被通過?log_line_prefix?包括在普通日志項中。只有可打印 ASCII 字符能被使用在application_name之中。其他字符將被替換為問號(?)。

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

這個參數(shù)啟用發(fā)出各種調試輸出。當設置時,會打印生成的解析樹, 查詢重寫輸出,或執(zhí)行的每個查詢的執(zhí)行計劃。這些信息是在LOG 信息級別發(fā)出,因此默認的,它們會出現(xiàn)在服務器日志中,但不會發(fā)送給客戶端。 可以通過 client_min_messages和/或log_min_messages 來設置。這些參數(shù)缺省是off。 這些參數(shù)將會讓多種調試輸出被發(fā)出。當被設置時,它們?yōu)槊恳粋€被執(zhí)行的查詢打印結果分析樹、查詢重寫器輸出或執(zhí)行計劃。這些消息在LOG消息級別上被發(fā)出,因此默認情況下它們將出現(xiàn)在服務器日志中但不會被發(fā)送到客戶端。你可以通過調整 client_min_messages和/或?log_min_messages?來改變這種情況。這些參數(shù)默認是關閉的。

debug_pretty_print (boolean)

當被設置時,debug_pretty_print會縮進由debug_print_parse、 debug_print_rewrittendebug_print_plan產(chǎn)生的輸出。這將導致比關閉參數(shù)時使用的緊湊模式可讀性更強但是更長的輸出。它默認是打開的。

log_checkpoints (boolean)

導致檢查點和重啟點被記錄在服務器日志中。一些統(tǒng)計信息也被包括在日志消息中,包括寫入緩沖區(qū)的數(shù)據(jù)和寫它們所花的時間。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。默認值是關閉。

log_connections (boolean)

導致每一次嘗試對服務器的連接被記錄,客戶端認證的成功完成也會被記錄。 只有超級用戶能在會話開始時更改這個參數(shù),在會話中它不能被更改。默認 為off

注意

某些客戶端程序(例如psql)在要求密碼時會嘗試連接兩次,因此重復的收到連接消息并不一定表示一個錯誤。

log_disconnections (boolean)

導致會話終止被記錄。日志輸出提供的信息類似于 log_connections,不過還外加會話的持續(xù)時間。 只有超級用戶能在會話開始時更改這個參數(shù),在會話中它不能被更改。默認 為off。

log_duration (boolean)

導致每一個完成的語句的持續(xù)時間被記錄。默認值是off。只有超級用戶可以改變這個設置。

對于使用擴展查詢協(xié)議的客戶端,解析、綁定和執(zhí)行步驟的持續(xù)時間將被獨立記錄。

注意

啟用log_duration和設置?log_min_duration_statement?為零之間的區(qū)別是,超過log_min_duration_statement強制查詢的文本被記錄,但這個選項不會。因此,如果 log_durationon并且log_min_duration_statement為正值,所有持續(xù)時間都將被記錄,但是只有超過閾值的語句才會被記錄查詢文本。這種行為有助于在高負載安裝中收集統(tǒng)計信息。

log_error_verbosity (enum)

控制為每一個被記錄的消息要寫入到服務器日志的細節(jié)量。有效值是TERSE、DEFAULTVERBOSE,每一個都為顯示的消息增加更多域。TERSE排除記錄DETAIL、HINTQUERYCONTEXT錯誤信息。VERBOSE輸出包括SQLSTATE錯誤碼(見附錄 A)以及產(chǎn)生錯誤的源代碼文件名、函數(shù)名和行號。只有超級用戶能夠更改這個設置。

log_hostname (boolean)

默認情況下,連接日志消息只顯示連接主機的 IP 地址。打開這個參數(shù)將導致也記錄主機名。注意根據(jù)你的主機名解析設置,這可能會導致很微小的性能損失。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

log_line_prefix (string)

這是一個printf風格的字符串,它在每個日志行的開頭輸出。 %字符開始轉義序列,它將被按照下文描述的替換成狀態(tài)信息。 未識別的轉義被忽略。其他字符被直接復制到日志行。某些轉義只被會話進程識別并且被主服務器進程等后臺進程當作空。 通過指定一個在%之后和該選項之前的數(shù)字可以讓狀態(tài)信息左對齊或右對齊。 負值將導致在右邊用空格填充狀態(tài)信息已達到最小寬度,而正值則在左邊填充。填充對于日志文件的人類可讀性大有幫助。

這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。默認值是'%m [%p] ',它記錄時間戳和進程ID。

轉義 效果 只限會話
%a 應用名
%u 用戶名
%d 數(shù)據(jù)庫名
%r 遠程主機名或 IP 地址,以及遠程端口
%h 遠程主機名或 IP 地址
%b 后端類型
%p 進程 ID
%t 無毫秒的時間戳
%m 帶毫秒的時間戳
%n 帶毫秒的時間戳(作為 Unix 時代) no
%i 命令標簽:會話當前命令的類型
%e SQLSTATE 錯誤代碼
%c 會話 ID:見下文
%l 對每個會話或進程的日志行號,從 1 開始
%s 進程開始的時間戳
%v 虛擬事務 ID (backendID/localXID)
%x 事務 ID (如果未分配則為 0)
%q 不產(chǎn)生輸出,但是告訴非會話進程在字符串的這一點停止;會話進程忽略
%% 純文字 %

后端類型對應視圖 pg_stat_activity 中的backend_type列。 但是其他類型可能會出現(xiàn)在日志中而不顯示在該視圖中。

%c轉義打印一個準唯一的會話標識符,它由兩個 4 字節(jié)的十六進制數(shù)(不帶先導零)組成,以點號分隔。 這些數(shù)字是進程啟動時間和進程 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設置了非空值,你通常應該讓它的最后一個字符為空格,這樣用以提供和日志行的剩余部分的視覺區(qū)別。也可以使用標點符號。

提示

Syslog產(chǎn)生自己的時間戳和進程 ID 信息,因此如果你記錄到syslog你可能不希望包括哪些轉義。

提示

在包括僅在會話(后端)上下文中可用的信息(如用戶名或者數(shù)據(jù)庫名)時,%q轉義很有用。例如:

log_line_prefix = '%m [%p] %q%u@%d/%a '
log_lock_waits (boolean)

控制當一個會話為獲得一個鎖等到超過deadlock_timeout時,是否要產(chǎn)生一個日志消息。這有助于決定是否所等待造成了性能低下。默認值是off。只有超級用戶可以更改這個設置。

log_parameter_max_length (integer)

如果大于零,則使用非錯誤語句日志消息記錄的每個綁定參數(shù)值都被裁剪為這么多字節(jié)。 零禁用非錯誤語句日志的綁定參數(shù)日志。-1(默認值)允許綁定參數(shù)被完整登錄。 如果指定此值時沒有單位,則將其作為字節(jié)。只有超級用戶可以更改此設置。

此設置僅影響作為結果打印的日志消息?log_statement?,?log_duration?, 和相關的設置。 該設置的非零值會增加一些開銷,特別是當參數(shù)以二進制形式發(fā)送時,因為需要轉換為文本。

log_parameter_max_length_on_error (integer)

如果大于零,則錯誤消息中報告的每個綁定參數(shù)值都將裁剪為這么多字節(jié)。 零(默認值)禁止在錯誤消息中包含綁定參數(shù)。-1允許打印完整綁定參數(shù)。 如果指定此值時沒有單位,則將其作為字節(jié)。

該設置的非零值會增加開銷,由于PostgreSQL需要在每條語句的開始處將參數(shù)值的文本表示存儲在內存中,無論最終是否會發(fā)生錯誤。 當綁定參數(shù)以二進制形式發(fā)送時,開銷比以文本形式發(fā)送時更大,因為前者需要數(shù)據(jù)轉換,而后者只需要復制字符串。

log_statement (enum)

控制哪些 SQL 語句被記錄。有效值是 none (off)、ddl、modall(所有語句)。ddl記錄所有數(shù)據(jù)定義語句,例如CREATEALTERDROP語句。mod記錄所有ddl語句,外加數(shù)據(jù)修改語句例如INSERT, UPDATE、DELETETRUNCATE, 和COPY FROM。 如果PREPAREEXECUTEEXPLAIN ANALYZE包含合適類型的命令,它們也會被記錄。對于使用擴展查詢協(xié)議的客戶端,當收到一個執(zhí)行消息時會產(chǎn)生日志并且會包括綁定參數(shù)的值(任何內嵌的單引號會被雙寫)。

默認值是none。只有超級用戶可以改變這個設置。

注意

即使使用log_statement = all設置,包含簡單語法錯誤的語句也不會被記錄。這是因為只有在完成基本語法解析并確定了語句類型之后才會發(fā)出日志消息。在擴展查詢協(xié)議的情況下,在執(zhí)行階段之前(即在解析分析或規(guī)劃期間)出錯的語句也不會被記錄。將log_min_error_statement設置為ERROR(或更低)來記錄這種語句。

log_replication_commands (boolean)

導致每一個復制命令都被記錄在服務器日志中。關于復制命令的詳細信息請見 第 52.4 節(jié)。默認值是off。只有 超級用戶可以更改這個設置。

log_temp_files (integer)

控制記錄臨時文件名和尺寸。臨時文件可以被創(chuàng)建用來排序、哈希和存儲臨時查詢結果。 如果啟用這個設置,當每一個臨時文件被刪除時都會產(chǎn)生一個日志項。 一個零值記錄所有臨時文件信息,而正值只記錄尺寸大于或等于指定數(shù)據(jù)量的文件。如果指定值時沒有單位,則以千字節(jié)為單位。默認設置為 -1,它禁用這種記錄。只有超級用戶可以更改這個設置。

log_timezone (string)

設置在服務器日志中寫入的時間戳的時區(qū)。和TimeZone不同,這個值是集簇范圍的,因此所有會話將報告一致的時間戳。內建默認值是GMT,但是通常會被在postgresql.conf中覆蓋。initdb將安裝一個對應于其系統(tǒng)環(huán)境的設置。詳見 第 8.5.3 節(jié)。這個參數(shù)只能在postgresql.conf文件中或在服務器命令行上設置。

19.8.4. 使用 CSV 格式的日志輸出

log_destination列表中包括csvlog提供了一種便捷方式將日志文件導入到一個數(shù)據(jù)庫表。這個選項發(fā)出逗號分隔值(CSV)格式的日志行,包括這些列: 帶毫秒的時間戳、 用戶名、 數(shù)據(jù)庫名、 進程 ID、 客戶端主機:端口號、 會話 ID、 每個會話的行號、 命令標簽、 會話開始時間、 虛擬事務 ID、 普通事務 ID、 錯誤嚴重性、 SQLSTATE 代碼、 錯誤消息、 錯誤消息詳情、 提示、 導致錯誤的內部查詢(如果有)、 錯誤位置所在的字符計數(shù)、 錯誤上下文、 導致錯誤的用戶查詢(如果有且被log_min_error_statement啟用)、 錯誤位置所在的字符計數(shù)、 在 PostgreSQL 源代碼中錯誤的位置(如果log_error_verbosity被設置為 verbose)以及應用名和后端類型。 下面是一個定義用來存儲 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,
  PRIMARY KEY (session_id, session_line_num)
);

It is also possible to access the file as a foreign table, using the supplied file_fdw module.

使用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,這樣在同一個文件中舊日志數(shù)據(jù)不會與新數(shù)據(jù)混雜。

  4. 上述表定義包括一個主鍵聲明。這有助于避免意外地兩次導入相同的信息。COPY命令一次提交所有它導入的數(shù)據(jù),因此任何錯誤將導致整個導入失敗。如果你導入一個部分完成的日志文件并且稍后當它完全完成后再次導入,主鍵違背將導致導入失敗。請等到日志完成且被關閉之后再導入。這個過程也可以避免意外地導入部分完成的行,這種行也將導致COPY失敗。

19.8.5. 進程標題

這些設置控制服務器進程的進程標題如何被修改。進程標題通??梢杂?span id="rrbv5hz" class="application">ps或者 Windows 上的進程瀏覽器等程序來查看。詳見第 27.1 節(jié)。

cluster_name (string)

為不同目的設置標識這個數(shù)據(jù)庫集群(實例)的名稱。此集群名稱出現(xiàn)在該集群中所有服務器進程的進程標題中。 此外,它還是備用連接的默認應用名稱。(參見 synchronous_standby_names.)

這個名稱可以是任何長度不超過NAMEDATALEN個字符(在標準編譯中是 64字符)的任何字符串。只有可打印的 ASCII 字符能被用在cluster_name值中。其他字符將被替換為問號(?)。如果這個參數(shù)被設置為空字符串''(也是默認值),將不會顯示名稱。這個參數(shù)只能在服務器啟動時設置。

update_process_title (boolean)

啟用進程標題更新,每次服務器接收到一個新的 SQL 命令時都更新進程標題。在大部分平臺上這個設置默認為on,但是由于 Windows 上更新進程標題的開銷更大,所以在 Windows 這個設置默認為off。只有超級用戶能更改這個設置。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號