配置 AlloyDB Omni 日志轮换

选择文档版本:

本文档介绍了如何在使用 AlloyDB Omni Kubernetes operator 时配置 AlloyDB Omni 诊断日志的轮换。

以下日志文件位于 /obs/diagnostic/ 目录中:

  1. postgresql.audit:此日志文件会收集会话和对象访问审核日志。如需收集审核日志,您需要启用审核日志

  2. postgresql.log:此日志文件会收集 PostgreSQL 服务器日志。这些日志始终会被收集,无需启用。

日志文件轮换时,会发生以下情况:

  1. 系统会将日志文件复制到 /obs/diagnostic/archive/ 目录。如果该目录中存在同名日志文件,则会被覆盖。

  2. 原始轮换日志文件的内容会删除,因此文件为空。

  3. 日志信息立即开始写入空的轮换日志文件。 日志信息会写入日志文件,直到文件达到大小或存在时间阈值,此时会再次轮换。日志会轮换,以免变得过大。

默认情况下,轮换设置会在每个日志文件的大小达到 200 MB 时进行轮换。默认轮换不包含存在时间设置。

归档文件会保留 7 天。系统会自动移除归档时间超过 7 天的文件,但在上次轮换期间归档的文件除外。例如,如果 log_rotation_age 早于 7 天,则归档文件在当前文件轮换之前达到 7 天的阈值。在这种情况下,此归档文件不会删除,直到下次轮换生成新的归档文件。

每个归档日志文件名都采用以下格式:postgresql-%Y-%m-%d_%H%M%S.log。 时间戳在日志轮换时确定,以世界协调时间 (UTC) 表示。例如,如果日志在 2024 年 12 月 20 日 UTC 时间 13:01:02 轮换,则归档文件名为 postgresql-2024-12-20_130102.log

每个归档文件都使用 Gzip 文件格式单独压缩。

启用审核日志

如需启用会话和对象访问日志记录,您必须在数据库集群中配置 pgAudit 参数,并在数据库中安装扩展程序。

第 1 步:在 DBCluster 参数中配置 pgAudit

如需在 postgresql.audit 文件中收集会话和对象访问日志,您必须启用 pgAudit 并使用 pgaudit.log 配置要记录的语句。

将以下行添加到 parameters 部分的 v1_dbcluster_parameters.yaml 文件:

alloydb.enable_pgaudit: "on"
pgaudit.log: "all"

以下示例展示了在 DBCluster 清单中的外观:

apiVersion: v1
kind: Secret
...
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
   name: DB_CLUSTER_NAME
spec:
  databaseVersion: "17.9.0"
  primarySpec:
    ...
    parameters:
      ...
      alloydb.enable_pgaudit: "on"
      pgaudit.log: "all"

如需了解详情,请参阅pgaudit支持的数据库扩展程序中。

第 2 步:在数据库中创建 pgAudit 扩展程序

配置参数并确保数据库已重启后,您必须连接到数据库并安装 pgAudit 扩展程序:

CREATE EXTENSION IF NOT EXISTS pgaudit;

您必须在要启用审核日志记录的每个数据库中运行此命令。此步骤是安装 DDL 审核所需的事件触发器的必要步骤。

pgAudit 参数 (GUC)

下表介绍了您可以在 parameters 规范的 DBCluster 部分中配置的关键 pgAudit 全局统一配置 参数 (GUC)。如需了解详情,请参阅 pgAudit 文档

参数 说明 默认值
pgaudit.log 指定会话审核日志记录哪些语句类。有效值为 noneallreadwritefunctionroleddlmiscmisc_set none
pgaudit.log_catalog 指定如果语句中的所有关系都在 pg_catalog 中,则启用会话日志记录。停用此功能可减少来自数据库客户端的日志噪音。 on
pgaudit.log_parameter 指定审核日志记录包含随语句传递的参数。 off
pgaudit.log_relation 指定会话审核是否为 SELECT 或 DML 语句中引用的每个关系(表、视图等)创建单独的日志条目。 off
pgaudit.log_rows 指定审核日志记录包含语句检索或影响的行数。 off
pgaudit.log_statement 指定日志记录是否包含语句文本和参数。 on
pgaudit.role 指定用于对象审核日志记录的主要角色。

PostgreSQL 服务器日志始终在 postgresql.log 文件中收集,无需启用 pgAudit。

查看审核日志文件的路径

使用 SQL 函数 alloydb_audit_current_logfile 查看审核日志文件的路径。如果审核处于已停用状态,结果为 NULL

SELECT alloydb_audit_current_logfile();

 alloydb_audit_current_logfile
----------------------------------
 /obs/diagnostic/postgresql.audit

配置日志轮换

如果您希望更好地控制日志轮换的时间,请配置文件大小上限、日志轮换之间的时长,或两者。日志轮换之间的时长也称为日志的存在时间。如果您同时使用这两项设置,则每当某个日志达到其中一个阈值时,系统就会对其进行轮换。

如需配置日志轮换,请在 DBCluster 清单的 parameters 部分设置以下一个或两个参数:

  • log_rotation_size:“SIZE_IN_KB
  • log_rotation_age:“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

日志轮换日志大小上限示例

以下示例会将日志设置为在文件大小达到 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

日志轮换时长示例

以下示例将日志设置为每 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

将审核日志转发到集中式接收器

AlloyDB Omni 会将审核日志写入数据库容器内的 /obs/diagnostic/postgresql.audit 文件。如果您想将这些日志转发到集中式日志记录接收器(例如 Cloud Logging、Datadog、Splunk 或 Elasticsearch),可以使用 Sidecar 自定义资源 (CR) 部署边车容器。

边车容器与数据库在同一 Pod 中运行,装载日志卷 (obsdisk),并跟踪日志文件以将其转发到日志记录目标。

示例:使用 Fluent Bit 边车转发日志

以下示例演示了如何使用 Fluent Bit 边车跟踪 pgAudit 日志并将其输出到标准输出,标准 Kubernetes 集群日志收集器(例如 Google Cloud Google Kubernetes Engine (GKE) 上的 Logging 代理)可以在其中收集这些日志。

  1. 为 Fluent Bit 配置创建 ConfigMap

    创建一个包含 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.audit
            Tag          pgaudit
            DB           /tmp/fluent-bit-pgaudit.db
    
        [OUTPUT]
            Name         stdout
            Match        *
    

    NAMESPACE 替换为数据库集群的命名空间。

  2. 创建 Sidecar 自定义资源

    创建一个 Sidecar 清单,用于定义 Fluent Bit 容器并装载 obsdisk 卷(包含 AlloyDB Omni 日志)和 ConfigMap 卷。

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: Sidecar
    metadata:
      name: pgaudit-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/
    
  3. 向数据库集群注册边车

    更新 DBCluster 清单以引用边车,或使用以下命令修补集群:

    kubectl patch dbclusters.alloydbomni.dbadmin.goog DB_CLUSTER_NAME -p '{"spec":{"primarySpec":{"sidecarRef":{"name":"pgaudit-forwarder"}}}}' --type=merge

    DB_CLUSTER_NAME 替换为数据库集群的名称。

    如需详细了解如何管理边车,请参阅 配置边车容器

后续步骤