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

PostgreSQL 数据库日志文件

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

要查看、下载和观看基于文件的数据库日志,请参阅访问 Amazon RDS 数据库日志文件

PostgreSQL 日志概述

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

日志内容

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

  • 查询失败

  • 登录失败

  • 致命的服务器错误

  • 死锁数

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

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

  • 连接和断开

  • 检查点

  • 架构修改查询

  • 等待锁定的查询

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

  • 消耗资源的后端 autovacuum 流程

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

参数组

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

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

设置日志保留期

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

要保留较旧的日志,请将其发布到 Amazon CloudWatch Logs。有关更多信息,请参阅 将 PostgreSQL 日志发布到 Amazon CloudWatch Logs

设置消息格式

默认情况下,Amazon RDS PostgreSQL 以标准错误 (stderr) 格式生成日志。在这种格式下,每条日志消息都以参数 log_line_prefix 指定的信息作为前缀。Amazon RDS 只允许针对 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

将 PostgreSQL 日志发布到 Amazon CloudWatch Logs

要在高持久性存储中存储 PostgreSQL 日志记录,您可以使用 Amazon CloudWatch Logs。利用 CloudWatch Logs,您还可以对日志数据进行实时分析,并使用 CloudWatch 查看指标和创建警报。例如,如果将 log_statements 设置为 ddl,则可以将警报设置为执行 DDL 语句时发出警报。

要使用 CloudWatch Logs,请为 PostgreSQL 数据库实例配置 RDS 以将日志数据发布到日志组。

注意

仅 PostgreSQL 版本 9.6.6 及更高版本以及 10.4 及更高版本支持将日志文件发布到 CloudWatch Logs。

您可以将以下日志类型发布到 CloudWatch Logs for RDS for PostgreSQL:

  • Postgresql 日志

  • 升级日志(不适用于 Aurora PostgreSQL)

在完成配置后,Amazon RDS 将日志事件发布到 CloudWatch 日志组内的日志流。例如,PostgreSQL 日志数据存储在日志组 /aws/rds/instance/my_instance/postgresql 中。要查看您的日志,请在 https://console.amazonaws.cn/cloudwatch/ 处打开 CloudWatch 控制台。

使用控制台将 PostgreSQL 日志发布到 CloudWatch Logs

  1. 通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Databases (数据库)

  3. 选择要修改的数据库实例,然后选择 Modify (修改)

  4. Log exports (日志导出) 部分中,选择要开始发布到 CloudWatch Logs 的日志。

    Log exports (日志导出) 部分仅适用于支持发布到 CloudWatch Logs 的 PostgreSQL 版本。

  5. 选择继续,然后选择摘要页面上的修改数据库实例

您可以使用 AWS CLI 来发布 PostgreSQL 日志。您可以调用带以下参数的 modify-db-instance 命令:

  • --db-instance-identifier

  • --cloudwatch-logs-export-configuration

注意

--cloudwatch-logs-export-configuration 选项进行的更改始终立即应用于数据库实例。因此,--apply-immediately--no-apply-immediately 选项没有影响。

您还可以通过调用以下 CLI 命令来发布 PostgreSQL 日志:

通过以下选项运行上述 CLI 命令之一:

  • --db-instance-identifier

  • --enable-cloudwatch-logs-exports

  • --db-instance-class

  • --engine

根据您运行的 CLI 命令,可能需要其他选项。

例 修改实例以将日志发布到 CloudWatch Logs

以下示例修改现有的 PostgreSQL 数据库实例以将日志文件发布到 CloudWatch Logs。--cloudwatch-logs-export-configuration 值是 JSON 对象。此对象的键是 EnableLogTypes,其值是具有 postgresqlupgrade 的任意组合的字符串的数组。

对于 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["postgresql", "upgrade"]}'

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["postgresql","upgrade"]}'

例 创建实例以将日志发布到 CloudWatch Logs

以下示例将创建一个 PostgreSQL 数据库实例并将日志文件发布到 CloudWatch Logs。--enable-cloudwatch-logs-exports 值是 JSON 字符串数组。这些字符串可以是 postgresqlupgrade 的任意组合。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance \ --db-instance-identifier mydbinstance \ --enable-cloudwatch-logs-exports '["postgresql","upgrade"]' \ --db-instance-class db.m4.large \ --engine postgres

对于 Windows:

aws rds create-db-instance ^ --db-instance-identifier mydbinstance ^ --enable-cloudwatch-logs-exports '["postgresql","upgrade"]' ^ --db-instance-class db.m4.large ^ --engine postgres

您可以使用 RDS API 来发布 PostgreSQL 日志。您可以使用以下参数调用 ModifyDBInstance 操作:

  • DBInstanceIdentifier

  • CloudwatchLogsExportConfiguration

注意

CloudwatchLogsExportConfiguration 参数进行的更改始终立即应用于数据库实例。因此,ApplyImmediately 参数没有影响。

您还可以通过调用以下 RDS API 操作来发布 PostgreSQL 日志:

使用以下参数运行这些 RDS API 操作之一:

  • DBInstanceIdentifier

  • EnableCloudwatchLogsExports

  • Engine

  • DBInstanceClass

根据您运行的操作,可能需要其他参数。