下列記錄檔位於 /obs/diagnostic/ 目錄中:
postgresql.log:這個記錄檔會收集 PostgreSQL 伺服器記錄,例如用戶端連線、查詢和管理通知。系統一律會收集這些記錄,不需要啟用。postgresql.audit:這個記錄檔會收集工作階段和物件存取稽核記錄。如要收集稽核記錄,請參閱「使用 pgAudit 管理稽核記錄」。
瞭解及設定記錄輪替
瞭解 AlloyDB Omni 如何處理記錄輪替,以及如何根據檔案大小或時間長度設定輪替門檻。
記錄輪替行為
記錄檔輪替時,會發生下列情況:
現有的記錄檔會封存至
/obs/diagnostic/archive/目錄。系統會重設
/obs/diagnostic/中的現用記錄檔,以便後續記錄項目寫入乾淨的檔案。記錄資訊會持續寫入作用中的記錄檔,直到檔案達到大小或時間門檻為止,此時系統會再次輪替記錄檔。記錄檔會輪替,以免作用中的記錄檔過大。
根據預設,輪替設定為每個記錄檔達到 200 MB 時輪替。預設輪播不會包含年齡設定。
封存的檔案會保留 7 天。系統會自動移除封存超過 7 天的檔案,但上次輪替期間封存的檔案除外。舉例來說,如果 log_rotation_age 的時間超過 7 天,則封存檔案會在目前檔案輪替前達到 7 天的門檻。在這種情況下,系統不會移除這個封存檔案,直到下一次輪替產生新的封存檔案為止。
每個輪替的記錄檔名稱都採用 postgresql-%Y-%m-%d_%H%M%S.EXTENSION.gz 格式,其中 EXTENSION 為 log 或 audit。輪替時間決定了世界標準時間 (UTC) 的時間戳記。舉例來說,如果記錄檔在 2024 年 12 月 20 日世界標準時間 13:01:02 輪替,封存的檔案名稱為 postgresql-2024-12-20_130102.log.gz。
系統會使用 gzip 檔案格式,個別壓縮每個封存檔案。
設定輪替門檻
如要控管記錄檔輪替時間,請設定檔案大小上限、記錄檔輪替間隔時間,或同時設定這兩項。記錄檔輪替之間的時間長度也稱為記錄檔的存續時間。如果同時使用這兩項設定,則每個記錄檔達到其中一個門檻時,就會輪替。
如要設定記錄輪替,請在 DBCluster 資訊清單的 parameters 區段中,設定下列一或兩個參數:
log_rotation_size:「SIZE_IN_KB」log_rotation_age:「AGE_IN_MINUTES」
更改下列內容:
SIZE_IN_KB:記錄檔輪替前的檔案大小上限 (以 KB 為單位)。AGE_IN_MINUTES:記錄檔輪替間隔時間,以分鐘為單位。
如要停用其中一項記錄輪替設定,請將其設為零 ("0")。如要保留預設設定,也就是在記錄檔達到 200 MB 時輪替記錄檔,請勿設定任何參數。
依記錄檔大小和時間長度輪替
下列範例會將記錄檔設為在檔案大小達到 400 MB 時輪替,或在記錄檔輪替間隔達到一天時輪替,以先發生者為準:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
spec:
...
primarySpec:
...
parameters:
log_rotation_size: "400000" # 400 MB
log_rotation_age: "1440" # 24 hours * 60 minutes = 1 day
將 DB_CLUSTER_NAME 替換為資料庫叢集名稱。
僅依記錄大小輪替
以下範例會將記錄檔設為在檔案大小達到 400 MB 時輪替:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
spec:
...
primarySpec:
...
parameters:
log_rotation_size: "400000" # 400 MB
log_rotation_age: "0" # Set to 0 to disable
將 DB_CLUSTER_NAME 替換為資料庫叢集名稱。
僅依時間長度輪播
以下範例會將記錄設為每 24 小時輪替一次:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
spec:
...
primarySpec:
...
parameters:
log_rotation_size: "0" # Set to 0 to disable
log_rotation_age: "1440" # 24 hours * 60 minutes = 1 day
將 DB_CLUSTER_NAME 替換為資料庫叢集名稱。
支援的 PostgreSQL 記錄參數
您可以在 DBCluster 資訊清單的 parameters 區段中,設定標準 PostgreSQL 記錄 Grand Unified Configuration (GUC) 參數,藉此設定要傳送至 postgresql.log 的資訊:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
spec:
...
primarySpec:
...
parameters:
log_min_messages: "warning"
log_min_duration_statement: "250" # Log queries taking >= 250ms
log_statement: "ddl" # Log all DDL statements
log_lock_waits: "on"
log_checkpoints: "on"
log_temp_files: "0" # Log all temporary files created
log_autovacuum_min_duration: "1000" # Log autovacuum runs taking >= 1s
將 DB_CLUSTER_NAME 替換為資料庫叢集名稱。
下表說明 PostgreSQL 說明文件中的「錯誤回報和記錄」一節,所列出的 PostgreSQL 支援記錄參數。
| 參數 | 說明 |
|---|---|
log_min_messages
|
控管系統在伺服器記錄檔中寫入哪些訊息層級。有效值為 debug5、debug4、debug3、debug2、debug1、info、notice、warning、error、log、fatal 和 panic。每個層級都包含下列所有嚴重程度。 |
log_min_error_statement
|
控制伺服器記錄中是否會包含產生錯誤狀況的 SQL 陳述式。有效值為 debug5 到 panic。如要停用陳述式錯誤記錄功能,請設為 panic。 |
log_min_duration_statement
|
如果陳述式執行時間至少達到指定的毫秒數,系統就會記錄每個已完成陳述式的執行時間。將這項參數設為 0,即可記錄所有陳述式和持續時間。如果設為 -1,系統就會停用時間記錄功能。 |
log_min_duration_sample
|
以 log_statement_sample_rate 設定的速率,對至少執行指定毫秒數的已完成陳述式進行取樣。設為 -1 即可停用取樣時間記錄功能。 |
log_statement_sample_rate
|
指定要記錄的陳述式比例 (0.0 至 1.0),這些陳述式會超過 log_min_duration_sample。 |
log_transaction_sample_rate
|
指定陳述式全數記錄的交易比例 (0.0 至 1.0),不論陳述式執行時間長度為何。 |
log_statement
|
控制要記錄哪些 SQL 陳述式:none (關閉)、ddl (所有資料定義指令)、mod (DDL 加上資料修改陳述式,例如 INSERT、UPDATE 和 DELETE) 或 all。 |
log_duration
|
記錄每個已完成陳述式的持續時間。除非也超過 log_min_duration_statement 門檻,否則不會列印查詢文字。 |
log_line_prefix
|
在每個記錄行開頭指定 printf 樣式的前置字串輸出 (例如 %m 代表時間戳記、%p 代表程序 ID、%u 代表使用者,以及 %d 代表資料庫)。 |
log_connections |
控制是否記錄資料庫的用戶端連線。 |
log_disconnections
|
控管是否要記錄工作階段終止和工作階段持續時間。 |
log_hostname
|
控管是否要記錄連線用戶端主機名稱和 IP 位址。 |
log_error_verbosity
|
控制伺服器記錄訊息的詳細程度:terse、default 或 verbose (包括 SQLSTATE 程式碼和來源行)。 |
log_lock_waits
|
控制工作階段等待鎖定時間超過 deadlock_timeout 時,是否要記錄訊息。 |
log_checkpoints
|
在記錄檔中記錄檢查點和重新啟動點,包括緩衝區寫入統計資料和時間。 |
log_autovacuum_min_duration
|
如果自動清除作業的執行時間至少達到指定的毫秒數,系統就會記錄自動清除作業執行的每個動作。將這項參數設為
0,即可記錄所有動作。如果設為 -1,系統會停用記錄功能。 |
log_temp_files
|
控制刪除暫存檔案 (用於排序、雜湊或查詢結果) 時,以 KB 為單位記錄暫存檔案名稱和大小。將這項參數設為 0,即可記錄所有暫存檔案。如果設為 -1,系統會停用記錄功能。 |
log_parameter_max_length
|
將記錄在非錯誤陳述式記錄中的繫結參數值,修剪至這個位元組數。將這項參數設為 -1,即可完整記錄值。如果設為 0,系統就會停用參數記錄功能。 |
log_parameter_max_length_on_error
|
將錯誤訊息中回報的繫結參數值修剪為這個位元組數。將這項參數設為 0,即可停用錯誤訊息中的參數。設為 -1 時,系統會完整記錄值。 |
log_replication_commands
|
控管是否要記錄複製指令和複製時段動作。 |
log_recovery_conflict_waits
|
控制啟動程序等待復原衝突的時間超過 deadlock_timeout 時,是否要記錄訊息。 |
log_startup_progress_interval
|
設定長時間執行的啟動作業進度訊息間隔時間 (以毫秒為單位)。將這項參數設為 0 即可停用。 |
log_timezone |
設定伺服器記錄中時間戳記使用的時區。 |
使用 pgAudit 管理稽核記錄
如要啟用工作階段和物件存取記錄,您必須在資料庫叢集中設定 pgAudit 參數,並在資料庫中安裝擴充功能。
步驟 1:在 DBCluster 資訊清單中設定 pgAudit 參數
如要在 postgresql.audit 檔案中收集工作階段和物件存取記錄,請啟用 pgAudit,並使用 pgaudit.log 參數設定要記錄的陳述式。
在 parameters 檔案的
v1_dbcluster_parameters.yaml
區段中新增下列程式碼:
alloydb.enable_pgaudit: "on"
pgaudit.log: "all"
以下範例顯示 DBCluster 資訊清單中的這項設定:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
spec:
databaseVersion: "15.7.0"
primarySpec:
...
parameters:
...
alloydb.enable_pgaudit: "on"
pgaudit.log: "all"
將 DB_CLUSTER_NAME 替換為資料庫叢集名稱。
詳情請參閱「pgaudit」一節的「支援的資料庫擴充功能」。
步驟 2:在每個資料庫中安裝 pgAudit 擴充功能
設定參數並重新啟動資料庫後,請連線至資料庫並安裝 pgAudit 擴充功能:
CREATE EXTENSION IF NOT EXISTS pgaudit;
在要啟用稽核記錄的每個資料庫中執行這項指令。這項指令會安裝 DDL 稽核所需的事件觸發條件。
支援的 pgAudit 參數
下表說明可在 DBCluster 規格的 parameters 區段中設定的主要 pgAudit 參數。詳情請參閱 pgAudit 說明文件。
| 參數 | 說明 | 預設值 |
|---|---|---|
pgaudit.log
|
指定工作階段稽核記錄要記錄哪些類別的陳述式。有效值為 none、all、read、write、function、role、ddl、misc 和 misc_set。 |
none
|
pgaudit.log_catalog
|
如果陳述式中的所有關係都在 pg_catalog 中,則指定啟用工作階段記錄。停用這項功能可減少資料庫用戶端的記錄噪音。 |
on
|
pgaudit.log_parameter
|
指定稽核記錄是否要納入陳述式傳遞的參數。 | off
|
pgaudit.log_relation
|
指定工作階段稽核是否為 DML 陳述式中參照的每個關係 (例如表格和檢視區塊) 建立個別的記錄項目。SELECT |
off
|
pgaudit.log_rows
|
指定稽核記錄檔包含陳述式擷取或影響的資料列數。 | off
|
pgaudit.log_statement
|
指出記錄是否包含陳述式文字和參數。 | on
|
pgaudit.role
|
指定用於物件稽核記錄的主要角色。 | 無 |
PostgreSQL 伺服器記錄一律會收集在 postgresql.log 檔案中,不需要啟用 pgAudit。
將資料庫記錄檔轉送至集中式接收器
AlloyDB Omni 會將資料庫伺服器記錄 (postgresql.log) 和稽核記錄 (postgresql.audit) 寫入資料庫容器內的 obsdisk 磁碟區中的 /obs/diagnostic/ 目錄。
如要將這些記錄轉送至集中式記錄檔接收器 (例如 Cloud Logging、Datadog、Splunk 或 Elasticsearch),可以使用Sidecar自訂資源 (CR) 部署 Sidecar 容器。
邊車容器與資料庫在同一個 Pod 中執行,並掛接記錄檔磁碟區 (obsdisk),以及追蹤記錄檔,將其轉送至記錄檔目的地。
範例:使用 Fluent Bit Sidecar 轉送記錄
以下範例說明如何使用 Fluent Bit Sidecar,追蹤所有 AlloyDB Omni 記錄檔,並將其寫入標準輸出。標準 Kubernetes 叢集記錄檔收集器 (例如 Google Kubernetes Engine (GKE) 上的 Logging 代理程式) 隨後即可收集這些記錄檔。
建立包含 Fluent Bit 設定的 ConfigMap,以追蹤伺服器和稽核記錄檔:
apiVersion: v1 kind: ConfigMap metadata: name: fluentbit-config namespace: NAMESPACE data: fluent-bit.conf: | [SERVICE] Flush 1 Daemon Off Log_Level info [INPUT] Name tail Path /obs/diagnostic/postgresql.log,/obs/diagnostic/postgresql.audit Tag alloydb.* Path_Key filename DB /tmp/fluent-bit.db [OUTPUT] Name stdout Match *將
NAMESPACE替換為資料庫叢集的命名空間。建立
Sidecar資訊清單,定義 Fluent Bit 容器並掛接obsdisk磁碟區 (內含 AlloyDB Omni 記錄) 和 ConfigMap 磁碟區:apiVersion: alloydbomni.dbadmin.goog/v1 kind: Sidecar metadata: name: logging-forwarder namespace: NAMESPACE spec: additionalVolumes: - name: fluentbit-config-volume configMap: name: fluentbit-config sidecars: - name: fluent-bit image: fluent/fluent-bit:3.0 command: ["/fluent-bit/bin/fluent-bit"] args: ["-c", "/fluent-bit/etc/fluent-bit.conf"] volumeMounts: - name: obsdisk mountPath: /obs - name: fluentbit-config-volume mountPath: /fluent-bit/etc/將
NAMESPACE替換為資料庫叢集的命名空間。更新
DBCluster資訊清單以參照 Sidecar,或使用下列指令修補叢集:kubectl patch dbclusters.alloydbomni.dbadmin.goog DB_CLUSTER_NAME -n NAMESPACE -p '{"spec":{"primarySpec":{"sidecarRef":{"name":"logging-forwarder"}}}}' --type=merge更改下列內容:
DB_CLUSTER_NAME:資料庫叢集名稱。NAMESPACE:資料庫叢集的命名空間。
如要進一步瞭解如何管理 Sidecar,請參閱「設定邊車容器」。
使用 SQL 查詢記錄輪替記錄
記錄檔輪替時,運算子會將封存的檔案儲存在 /obs/diagnostic/archive/ 目錄中,並將輪替時間戳記格式化為 postgresql-%Y-%m-%d_%H%M%S.EXTENSION.gz。
您可以使用標準 PostgreSQL 檔案系統函式,直接從資料庫查詢最新的記錄輪替時間。
從封存的記錄檔名檢查輪替時間戳記
如要查看最近的記錄檔輪替和已剖析的 UTC 輪替時間戳記,請執行下列查詢:
SELECT
file,
to_timestamp(
substring(file from 'postgresql-([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{6})') || '+00',
'YYYY-MM-DD_HH24MISS+TZH'
) AS rotated_at
FROM pg_ls_dir('/obs/diagnostic/archive') AS file
WHERE file ~ '^postgresql-[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{6}'
ORDER BY rotated_at DESC
LIMIT 5;
輸出結果會與下列內容相似:
file | rotated_at
------------------------------------------+------------------------
postgresql-2026-09-29_171900.log.gz | 2026-09-29 17:19:00+00
postgresql-2026-09-29_072800.log.gz | 2026-09-29 07:28:00+00
postgresql-2026-09-28_175300.log.gz | 2026-09-28 17:53:00+00
postgresql-2026-09-28_093400.log.gz | 2026-09-28 09:34:00+00
postgresql-2026-09-28_092000.audit.gz | 2026-09-28 09:20:00+00
(5 rows)