PostgreSQL 数据库日志文件 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

PostgreSQL 数据库日志文件

Aurora PostgreSQL 生成查询和错误日志。在使用数据库时,可以使用日志消息来排查性能和审计问题。

要查看、下载和观看基于文件的数据库日志,请参阅使用 Amazon Aurora 数据库日志文件

PostgreSQL 日志概述

PostgreSQL 会生成事件日志文件,其中包含对数据库管理员有用的信息。

日志内容

默认的日志记录级别会捕获影响服务器的错误。默认情况下,Aurora PostgreSQL 日志记录参数会捕获所有服务器错误,包括以下内容:

  • 查询失败

  • 登录失败

  • 致命的服务器错误

  • 死锁数

要确定应用程序问题,可以使用上述错误消息。例如,如果您将旧版应用程序从 Oracle 转换为 Aurora PostgreSQL,部分查询可能无法正确转换。这些格式错误的查询会在日志中生成错误消息,您可以使用这些错误消息来识别有问题的代码。

您可以修改 PostgreSQL 日志记录参数来捕获其他信息,包括以下内容:

  • 连接和断开

  • 检查点

  • 架构修改查询

  • 等待锁定的查询

  • 使用临时磁盘存储的查询

  • 消耗资源的后端 autovacuum 流程

上述日志信息可以帮助排查潜在的性能和审计问题。有关更多信息,请参阅 PostgreSQL 文档中的错误报告和日志记录。有关 PostgreSQL 日志记录的 Amazon 博客,请参阅用 RDS 和 Aurora PostgreSQL 日志:第 1 部分以及使用 RDS 和 Aurora PostgreSQL 日志:第 2 部分,了解有用信息。

参数组

每个 Aurora PostgreSQL 实例都与包含特定于引擎的配置的参数组相关联。引擎配置还包含多个控制 PostgreSQL 日志记录行为的参数。Amazon 为参数组提供了用于实例的默认配置设置。但是,要更改默认设置,您必须为默认参数组创建克隆,对其进行修改,然后将其附加到实例。

要设置数据库实例的日志记录参数,请在数据库参数组中设置参数,并将该参数组与数据库实例关联。有关更多信息,请参阅使用数据库参数组和数据库集群参数组

设置日志保留期

要设置系统日志的保留期,请使用 rds.log_retention_period 参数。您可以在与数据库实例关联的数据库参数组中找到 rds.log_retention_period。此参数的单位是分钟。例如,设置为 1,440 表示将日志保留一天。默认值为 4,320(三天)。最大值为 10,080(七天)。实例必须拥有足够的已分配存储容量来容纳保留的日志文件。

在数据库实例的存储达到阈值时,Amazon Aurora 会压缩较旧的 PostgreSQL 日志。Aurora 使用 gzip 压缩实用程序压缩文件;有关 gzip 的信息,请参阅 gzip 网站。当数据库实例的存储空间不足且所有可用日志都被压缩时,您会收到如下所示的警告。

Warning: local storage for PostgreSQL log files is critically low for this Aurora PostgreSQL instance, and could lead to a database outage.
注意

如果存储空间过少,Aurora 可能会在保留期过期之前删除压缩的 PostgreSQL 日志。如果提前删除日志,您会收到如下所示的消息。

The oldest PostgreSQL log files were deleted due to local storage constraints.

要保留较旧的日志,请将其发布到 Amazon CloudWatch Logs。有关更多信息,请参阅 。将 Aurora PostgreSQL 日志发布到 Amazon CloudWatch Logs。设置 CloudWatch 发布后,在日志发布到 CloudWatch Logs 之前 Aurora 不会删除日志。

设置日志文件轮换

要控制 PostgreSQL 日志文件轮换,请在与数据库实例关联的数据库参数组中设置两个参数:log_rotation_agelog_rotation_size。这两个设置控制何时创建新的、不同的日志文件。

日志文件名基于 log_filename 参数的文件名模式。例如,要提供粒度小于一小时的日志文件名,请将 log_filename 设置为分钟格式:postgresql.log.%Y-%m-%d-%H%M。只有 PostgreSQL 版本 10 及更高版本支持小于一小时的粒度。要为日志文件名使用以小时为单位的粒度,请将 log_filename 设置为小时格式:postgresql.log.%Y-%m-%d-%H

要根据时间控制日志文件轮换,请将 log_rotation_age 参数设置为从 1 分钟到 1,440 分钟(24 小时)的任意时间。(log_rotation_age 默认为 60 分钟。)如果将 log_rotation_age 参数设置为小于 60 分钟,还需要将 log_filename 参数设置为分钟格式。

要根据文件大小控制日志文件轮换,请将 log_rotation_size 参数设置为 50,000 到 1,000,000 KB 的任意大小。默认值为 100,000 KB。建议您还需要将 log_filename 参数设置为分钟格式。如果 log_rotation_age 参数为 60 分钟或更大,则进行此设置可确保您可以在不到一小时内创建新的日志文件。

设置消息格式

默认情况下,Aurora PostgreSQL 以标准错误 (stderr) 格式生成日志。在这种格式下,每条日志消息都以参数 log_line_prefix 指定的信息作为前缀。Aurora 只允许针对 log_line_prefix 使用以下值:

%t:%r:%u@%d:[%p]:t

先前的值映射到以下代码:

log-time : remote-host : user-name @ db-name : [ process-id ]

例如,以下错误消息由于使用错误名称查询列所致。

2019-03-10 03:54:59 UTC:10.0.0.123(52834):postgres@tstdb:[20175]:ERROR: column "wrong" does not exist at character 8

要指定输出日志的格式,请使用参数 log_destination。要使实例可生成标准和 CSV 两种输出文件,请在实例参数组中将 log_destination 设置为 csvlog。有关 PostgreSQL 日志的讨论,请参阅使用 RDS 和 Aurora PostgreSQL 日志:第 1 部分

启用查询日志记录

可为 PostgreSQL 数据库实例启用查询日志记录功能,方法是设置与数据库实例相关联的数据库参数组中的以下两个参数:log_statementlog_min_duration_statement

log_statement 参数控制需要记录的 SQL 语句。默认值为 none。建议您在数据库实例中调试问题时,将此参数设置为 all。要记录所有数据定义语言 (DDL) 语句(CREATE、ALTER、DROP 等),请将此值设置为 ddl。要记录所有 DDL 和数据修改语言 (DML) 语句(INSERT、UPDATE、DELETE 等),请将此值设置为 mod

警告

如果将 log_statement 参数设置为 ddlmodall,可能会暴露密码等敏感信息。要避免带来此风险,请将 log_statement 设置为 none。此外,还可以考虑以下解决方案:

  • 对客户端的敏感信息进行加密,然后使用 ENCRYPTEDALTER 语句的 CREATEUNENCRYPTED 选项。

  • 限制对 CloudWatch 日志的访问。

  • 使用更强的身份验证机制,如 IAM。

对于审计,您可以使用 PostgreSQL pgAudit 扩展,因为它会编辑 CREATE 和 ALTER 命令的敏感信息。

log_min_duration_statement 参数设定需要记录的语句的限制 (以毫秒为单位)。所有运行时间长于该参数设置的 SQL 语句都会被系统记录。默认情况下,该参数处于禁用状态并设置为 -1。启用该参数可帮助查找未优化的查询。

要设置查询日志记录,请执行以下步骤:

  1. log_statement 参数设置为 all.以下示例显示了写入 postgres.log 文件的信息。

    2013-11-05 16:48:56 UTC::@:[2952]:LOG: received SIGHUP, reloading configuration files 2013-11-05 16:48:56 UTC::@:[2952]:LOG: parameter "log_statement" changed to "all"

    在运行查询时,其他信息也会写入 postgres.log 文件。以下示例显示了查询后写入文件的信息类型。

    2013-11-05 16:41:07 UTC::@:[2955]:LOG: checkpoint starting: time 2013-11-05 16:41:07 UTC::@:[2955]:LOG: checkpoint complete: wrote 1 buffers (0.3%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=0.000 s, sync=0.003 s, total=0.012 s; sync files=1, longest=0.003 s, average=0.003 s 2013-11-05 16:45:14 UTC:[local]:master@postgres:[8839]:LOG: statement: SELECT d.datname as "Name", pg_catalog.pg_get_userbyid(d.datdba) as "Owner", pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding", d.datcollate as "Collate", d.datctype as "Ctype", pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges" FROM pg_catalog.pg_database d ORDER BY 1; 2013-11-05 16:45:
  2. 设置 log_min_duration_statement 参数。以下示例显示了参数设置为 1 时写入 postgres.log 文件的信息。

    2013-11-05 16:48:56 UTC::@:[2952]:LOG: received SIGHUP, reloading configuration files 2013-11-05 16:48:56 UTC::@:[2952]:LOG: parameter "log_min_duration_statement" changed to "1"

    在运行持续时间超过参数设置的查询时,其他信息也会写入 postgres.log 文件。以下示例显示了查询后写入文件的信息类型。

    2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: statement: SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), pg_catalog.pg_get_constraintdef(con.oid, true), contype, condeferrable, condeferred, c2.reltablespace FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x')) WHERE c.oid = '1255' AND c.oid = i.indrelid AND i.indexrelid = c2.oid ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname; 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: duration: 3.367 ms 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: statement: SELECT c.oid::pg_catalog.regclass FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhparent AND i.inhrelid = '1255' ORDER BY inhseqno; 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: duration: 1.002 ms 2013-11-05 16:51:10 UTC:[local]:master@postgres:[9193]:LOG: statement: SELECT c.oid::pg_catalog.regclass FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhrelid AND i.inhparent = '1255' ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text; 2013-11-05 16:51:18 UTC:[local]:master@postgres:[9193]:LOG: statement: select proname from pg_proc; 2013-11-05 16:51:18 UTC:[local]:master@postgres:[9193]:LOG: duration: 3.469 ms