設定 AlloyDB Omni 記錄檔輪替

選取說明文件版本:

本文說明使用 AlloyDB Omni Kubernetes 運算子時,如何設定 AlloyDB Omni 診斷記錄的輪替。

下列記錄檔位於 /obs/diagnostic/ 目錄中:

  • postgresql.log:這個記錄檔會收集 PostgreSQL 伺服器記錄,例如用戶端連線、查詢和管理通知。系統一律會收集這些記錄,不需要啟用。

  • postgresql.audit:這個記錄檔會收集工作階段和物件存取稽核記錄。如要收集稽核記錄,請參閱「使用 pgAudit 管理稽核記錄」。

瞭解及設定記錄輪替

瞭解 AlloyDB Omni 如何處理記錄輪替,以及如何根據檔案大小或時間長度設定輪替門檻。

記錄輪替行為

記錄檔輪替時,會發生下列情況:

  1. 現有的記錄檔會封存至 /obs/diagnostic/archive/ 目錄。

  2. 系統會重設 /obs/diagnostic/ 中的現用記錄檔,以便後續記錄項目寫入乾淨的檔案。

  3. 記錄資訊會持續寫入作用中的記錄檔,直到檔案達到大小或時間門檻為止,此時系統會再次輪替記錄檔。記錄檔會輪替,以免作用中的記錄檔過大。

根據預設,輪替設定為每個記錄檔達到 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 代理程式) 隨後即可收集這些記錄檔。

  1. 建立包含 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 替換為資料庫叢集的命名空間。

  2. 建立 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 替換為資料庫叢集的命名空間。

  3. 更新 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)

後續步驟