Postgresql

PostgreSQL 日誌記錄:語句分成多行

  • March 23, 2022

在 PostgreSQL v10 及更高版本中,我使用副檔名 pg_stat_statements 啟動了語句的日誌記錄。我的配置:

logging_collector = on
log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u,app=%a,client=%h '
log_destination = 'stderr,syslog'
log_statement = all

如果我執行一個簡單的查詢:

postgres=# select current_timestamp;

在日誌中,它將顯示前綴和語句,如下所示:

Line 1: (prefix) statement: select current_timestamp;

但是,如果我有一個拆分為多行的查詢,例如:

select
current_timestamp;

在日誌中它將顯示 2 行:

Line 1: (prefix) select
Line 2: current_timestamp;

這個“current_timestamp”是孤立的,沒有前綴,我無法將行與“select”部分匹配。

如何配置以使多行語句顯示在日誌的單行中?

像這樣:

陳述:

select
current_timestamp;

日誌:

Line 1: (prefix) statement: select current_timestamp;

我已經測試更改為 csvlog 並且得到了相同的結果。

為什麼我需要這個?我將日誌配置為發送到中央數據庫以進行審計。這些日誌通過 Kiabana 儀表板公開。一個語句的日誌中有幾行,特別是如果行(第一行除外)沒有前綴,則很難找到完整的語句。

謝謝你。

只要您使用適當的 csv 解析器,csv 格式就很容易解析。嵌入的換行符在引號內,將被正確理解為不是記錄終止符。

如果您使用此處描述的方式將其發送到中央數據庫,它應該可以正常工作。

PostgreSQL 不會從語句中刪除換行符。使用stderr日誌格式,您可以分辨出這樣的續行,因為它們以製表符開頭。

但我的建議是使用csvlog. 這也不會刪除換行符,但它會用雙引號正確轉義它們,以便每個 CSV 解析器都可以正確讀取它們。

引用自:https://dba.stackexchange.com/questions/310026