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

PostgreSQL 数据库日志文件

Amazon RDS for PostgreSQL 生成查询和错误日志。RDS PostgreSQL 将 autovacuum 信息和 rds_admin 操作写入错误日志。PostgreSQL 还会将连接、断开连接和检查点记录到错误日志中。有关更多信息,请参阅 PostgreSQL 文档中的错误报告和日志记录

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

设置日志保留期

要设置系统日志的保留期,请使用 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 分钟或更大,则进行此设置可确保您可以在不到一小时内创建新的日志文件。

使用查询日志记录

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

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

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