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

PostgreSQL 数据库日志文件

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

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

PostgreSQL 日志概述

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

日志内容

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

  • 查询失败

  • 登录失败

  • 致命的服务器错误

  • 死锁数

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

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

  • 连接和断开

  • 检查点

  • 架构修改查询

  • 等待锁定的查询

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

  • 消耗资源的后端 autovacuum 流程

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

参数组

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

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

设置日志保留期

要设置系统日志的保留期,请使用 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. 选择继续,然后选择摘要页面上的修改数据库实例

您可以使用 Amazon 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

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