RDS for PostgreSQL 数据库日志文件 - Amazon Relational Database Service

RDS for PostgreSQL 数据库日志文件

RDS for PostgreSQL 将数据库活动记录到原定设置 PostgreSQL 日志文件中。对于本地 PostgreSQL 数据库实例,这些消息本地存储在 log/postgresql.log 中,但对于 RDS for PostgreSQL 数据库实例,日志文件在 Amazon RDS 实例上可用,并要求您使用 Amazon RDS 控制台查看或下载其内容。原定设置日志记录级别可捕获登录失败、严重服务器错误、死锁和查询失败。

有关如何查看、下载和监视基于文件的数据库日志的更多信息,请参阅 监控 Amazon RDS 日志文件。要了解有关 PostgreSQL 日志的更多信息,请参阅 Working with Amazon RDS and Aurora PostgreSQL logs: Part 1Working with Amazon RDS and Aurora PostgreSQL logs: Part 2

除了本主题中讨论的标准 PostgreSQL 日志外,RDS for PostgreSQL 还支持 PostgreSQL Audit 扩展(pgAudit)。大多数受监管行业和政府机构需要保留对数据所做更改的审计日志或审计跟踪,以符合法律要求。有关安装和使用 pgAudit 的更多信息,请参阅 使用 pgAudit 记录数据库活动

影响日志记录行为的参数

您可以通过修改各种参数来自定义 RDS for PostgreSQL 数据库实例的日志记录行为。在下表中,您可以找到影响日志存储时间长度、何时轮换日志、是否以 CSV(逗号分隔值)格式输出日志以及发送到 STDERR 的文本输出等设置的参数。要更改可修改参数的设置,您需要为以下项目使用自定义数据库参数组: RDS for PostgreSQL 实例。有关更多信息,请参阅使用数据库参数组如表中所述,无法更改 log_line_prefix

参数 默认值 描述

log_destination

stderr

设置日志的输出格式。原定设置为 stderr,但您也可以通过向设置中添加 csvlog 来指定逗号分隔值(CSV)。有关更多信息,请参阅 设置日志目标(stderr、csvlog)

log_filename

postgresql.log.%Y-%m-%d-%H

指定日志文件名的模式。除原定设置外,此参数还支持使用 postgresql.log.%Y-%m-%d 作为文件名模式。

log_line_prefix

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

为写入 stderr 的每个日志行定义前缀,以记录时间(%t)、远程主机(%r)、用户(%u)、数据库(%d)和进程 ID(%p)。您无法修改此参数。

log_rotation_age

60

此分钟数后,将自动轮换日志文件。您可以将其更改为 1 到 1440 分钟。有关更多信息,请参阅设置日志文件轮换

log_rotation_size

日志自动轮换的大小(kB)。原定设置情况下,不使用此参数,因为日志是根据 log_rotation_age 参数轮换的。要了解更多信息,请参阅“设置日志文件轮换”。

rds.log_retention_period

4320

超过指定分钟数的 PostgreSQL 日志将被删除。默认值为 4320 分钟,表示系统将在 3 天后删除日志文件。有关更多信息,请参阅设置日志保留期

要识别应用程序问题,您可以在日志中查找查询失败、登录失败、死锁和致命的服务器错误。例如,假设您将旧版应用程序从 Oracle 转换为 Amazon RDS PostgreSQL,但部分查询可能未正确转换。这些格式不正确的查询会生成错误消息,您可以在日志中找到这些错误消息以帮助识别问题。有关日志记录查询的更多信息,请参阅 为您的 RDS for PostgreSQL 数据库实例开启查询日志记录

在以下主题中,您可以找到有关如何设置各种参数(用于控制 PostgreSQL 日志的基本详细信息)的信息。

设置日志保留期

rds.log_retention_period 参数指定 RDS for PostgreSQL 数据库实例将其日志文件保留多长时间。原定设置为 3 天(4320 分钟),但您可以将其设置为 1 天(1440 分钟)到 7 天(10080 分钟)之间的任意值。确保您的 RDS for PostgreSQL 数据库实例具有足够的存储空间,可将日志文件保留一段时间。

建议您将日志定期发布到 Amazon CloudWatch Logs,以便您可以在日志从 RDS for PostgreSQL 数据库实例中删除很久之后查看和分析系统数据。有关更多信息,请参阅将 PostgreSQL 日志发布到 Amazon CloudWatch Logs

设置日志文件轮换

默认情况下,Amazon RDS 每小时都会创建新的日志文件。计时由 log_rotation_age 参数控制。此参数的默认值为 60(分钟),但您可以设置为 1 分钟到 24 小时(1,440 分钟)之间的任意值。轮换时,系统将创建一个新的不同日志文件。该文件根据 log_filename 参数指定的模式命名。

也可以根据日志文件的大小进行轮换(如 log_rotation_size 参数指定)。此参数指定在日志达到相应大小(以千字节为单位)时应轮换日志。对于 RDS for PostgreSQL 数据库实例,log_rotation_size 未设置,也就是说,未指定任何值。但是,该参数允许在 0-2097151 KB(千字节)范围内进行设置。

日志文件名基于在 log_filename 参数中指定的文件名模式。此参数的可用设置如下:

  • postgresql.log.%Y-%m-%d – 日志文件名的原定设置格式。在日志文件的名称中包括年、月和日。

  • postgresql.log.%Y-%m-%d-%H – 在日志文件名格式中包含小时。

有关更多信息,请参阅 PostgreSQL 文档中的 log_rotation_agelog_rotation_size

设置日志目标(stderrcsvlog

默认情况下,Amazon RDS PostgreSQL 以标准错误 (stderr) 格式生成日志。这是 log_destination 参数的原定设置。每条消息都使用在 log_line_prefix 参数中指定的模式作为前缀。有关更多信息,请参阅了解 log_line_prefix 参数

RDS for PostgreSQL 也可以按 csvlog 格式生成日志。csvlog 用于将日志数据作为逗号分隔值(CSV)数据进行分析。例如,假设您使用 log_fdw 扩展将日志作为外部表处理。在 stderr 日志文件上创建的外部表包含一个列,其中包含日志事件数据。通过向 csvlog 参数添加 log_destination,可以获得 CSV 格式的日志文件,其中对外部表的多个列进行了分界。这使您可以更轻松地对日志进行排序和分析。要了解如何将 log_fdwcsvlog 结合使用,请参阅 使用 log_fdw 扩展通过 SQL 访问数据库日志

如果您为此参数指定 csvlog,请注意将同时生成 stderrcsvlog 文件。确保监控日志所占用的存储空间,同时考虑 rds.log_retention_period 以及影响日志存储和周转的其他设置。使用 stderrcsvlog 会使日志占用的存储空间增加一倍以上。

如果将 csvlog 添加到 log_destination 并想单独恢复到 stderr,则需要重置参数。为此,请使用 Amazon RDS 控制台,为您的实例打开自定义数据库参数组。选择 log_destination 参数,选择 Edit parameter(编辑参数),然后选择 Reset(重置)。

有关配置日志记录的更多信息,请参阅使用 Amazon RDS 和 Aurora PostgreSQL 日志:第 1 部分

了解 log_line_prefix 参数

stderr 日志格式将由 log_line_prefix 参数指定的详细信息作为每条日志消息的前缀,如下所示。

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

您无法更改此设置。因此,发送到 stderr 的每个日志条目都包含以下信息。

  • %t – 日志条目的时间。

  • %r – 远程主机地址。

  • %u@%d – 用户名 @ 数据库名称。

  • [%p] – 进程 ID(如果有)。

为您的 RDS for PostgreSQL 数据库实例开启查询日志记录

通过设置下表中列出的一些参数,您可以收集有关数据库活动的更多详细信息,包括查询、等待锁定的查询、检查点和许多其他详细信息。本主题重点介绍日志记录查询。

参数 默认值 描述

log_connections

记录每个成功的连接。

log_disconnections

记录每个会话的结束及其持续时间。

log_checkpoints

1

记录每个检查点。

log_lock_waits

记录长锁定等待次数。原定设置情况下,不设置此参数。

log_min_duration_sample

(ms) 设置如超出则记录语句示例的最短执行时间。示例数量使用 log_statement_sample_rate 参数进行设置。

log_min_duration_statement

全部

设置所记录的语句类型。

log_statement

设置所记录的语句类型。原定设置情况下,未设置此参数,但您可以将其更改为 allddlmod,以指定要记录的 SQL 语句的类型。如果您为此参数指定了与 none 不同的任何值,还应采取其他措施来防止日志文件中的密码泄露。有关更多信息,请参阅降低使用查询日志记录时泄露密码的风险

log_statement_sample_rate

超过在 log_min_duration_sample 中指定的时间的语句百分比,以介于 0.0 和 1.0 之间的浮点值表示。

log_statement_stats

向服务器日志写入累计性能统计数据。

使用日志记录查找执行缓慢的查询

您可以记录 SQL 语句和查询,以帮助查找以记录 SQL 语句和查询为重点的主题。您可以通过修改本节中概述的 log_statementlog_min_duration 参数的设置来开启此功能。在为 RDS for PostgreSQL 数据库实例开启查询日志记录之前,您应该了解日志中可能存在的密码泄露以及如何降低风险。有关更多信息,请参阅降低使用查询日志记录时泄露密码的风险

接下来,您可以了解有关 log_statementlog_min_duration 参数的参考信息。

log_statement

此参数指定应发送到日志的 SQL 语句的类型。默认值为 none。如果您将此参数更改为 allddlmod,请务必采取一些建议的操作来降低在日志中泄露密码的风险。有关更多信息,请参阅降低使用查询日志记录时泄露密码的风险

全部

记录所有语句。建议将此设置用于调试目的。

ddl

记录所有数据定义语言(DDL)语句,例如 CREATE、ALTER、DROP 等。

mod

记录所有可修改数据的 DDL 语句和数据操作语言(DML)语句,例如 INSERT、UPDATE 和 DELETE。

不记录任何 SQL 语句。我们建议使用此设置,以避免在日志中泄露密码的风险。

log_min_duration_statement

任何运行时间超过此参数设置所指定的毫秒数的 SQL 语句都会被记录下来。原定设置情况下,不设置此参数。开启该参数可帮助查找未优化的查询。

–1–2147483647

如超过即记录语句的运行时间的毫秒数(ms)。

设置查询日志记录

这些步骤假设您的 RDS for PostgreSQL 数据库实例使用自定义数据库参数组。

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

    2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:LOG: statement: SELECT feedback, s.sentiment,s.confidence FROM support,aws_comprehend.detect_sentiment(feedback, 'en') s ORDER BY s.confidence DESC; 2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:LOG: QUERY STATISTICS 2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:DETAIL: ! system usage stats: ! 0.017355 s user, 0.000000 s system, 0.168593 s elapsed ! [0.025146 s user, 0.000000 s system total] ! 36644 kB max resident size ! 0/8 [0/8] filesystem blocks in/out ! 0/733 [0/1364] page faults/reclaims, 0 [0] swaps ! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent ! 19/0 [27/0] voluntary/involuntary context switches 2022-10-05 22:05:52 UTC:52.95.4.1(11335):postgres@labdb:[3639]:STATEMENT: SELECT feedback, s.sentiment,s.confidence FROM support,aws_comprehend.detect_sentiment(feedback, 'en') s ORDER BY s.confidence DESC; 2022-10-05 22:05:56 UTC:52.95.4.1(11335):postgres@labdb:[3639]:ERROR: syntax error at or near "ORDER" at character 1 2022-10-05 22:05:56 UTC:52.95.4.1(11335):postgres@labdb:[3639]:STATEMENT: ORDER BY s.confidence DESC; ----------------------- END OF LOG ----------------------
  2. 设置 log_min_duration_statement 参数。以下示例显示了参数设置为 postgresql.log 时写入 1 文件的信息。

    将记录超过在 log_min_duration_statement 参数中指定的持续时间的查询。下面是一个示例。您可以在 Amazon RDS 控制台中查看 RDS for PostgreSQL 数据库实例的日志文件。

    2022-10-05 19:05:19 UTC:52.95.4.1(6461):postgres@labdb:[6144]:LOG: statement: DROP table comments; 2022-10-05 19:05:19 UTC:52.95.4.1(6461):postgres@labdb:[6144]:LOG: duration: 167.754 ms 2022-10-05 19:08:07 UTC::@:[355]:LOG: checkpoint starting: time 2022-10-05 19:08:08 UTC::@:[355]:LOG: checkpoint complete: wrote 11 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.013 s, sync=0.006 s, total=1.033 s; sync files=8, longest=0.004 s, average=0.001 s; distance=131028 kB, estimate=131028 kB ----------------------- END OF LOG ----------------------

降低使用查询日志记录时泄露密码的风险

我们建议您将 log_statement 保持设置为 none,以避免泄露密码。如果您将 log_statement 设置为 allddlmod,我们建议您采取以下一个或多个步骤。

  • 对于客户端,加密敏感信息。有关更多信息,请参阅 PostgreSQL 文档中的加密选项。使用 ENCRYPTEDUNENCRYPTED 语句的 CREATE(和 ALTER)选项。有关更多信息,请参阅 PostgreSQL 文档中的 CREATE USER

  • 对于您的 RDS for PostgreSQL 数据库实例,请设置并使用 PostgreSQL Auditing(pgAudit)扩展。此扩展编辑发送到日志的 CREATE 和 ALTER 语句中的敏感信息。有关更多信息,请参阅使用 pgAudit 记录数据库活动

  • 限制对 CloudWatch Logs 的访问。

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

将 PostgreSQL 日志发布到 Amazon CloudWatch Logs

要在高持久性存储中存储 PostgreSQL 日志记录,您可以使用 Amazon CloudWatch Logs。利用 CloudWatch Logs,您还可以对日志数据进行实时分析,并使用 CloudWatch 查看指标和创建警报。例如,如果您将 log_statements 设置为 ddl,则可以将告警设置为只要执行 DDL 语句就发出提示。在创建 RDS for PostgreSQL 数据库实例的过程中,您可以选择使用 PostgreSQL 日志/CloudWatch Logs。如果您当时选择不上载日志,可以稍后修改您的实例,以便从那时起开始上载日志。换句话说,不会上载现有日志,只有在修改后的 RDS for PostgreSQL 数据库实例上创建了新日志时才上载这些新日志。当 PostgreSQL 日志上载到 CloudWatch Logs 时,它们不再保存在 Logs & events(日志和事件)选项卡的 Logs(日志)部分中。相反,要查看它们,您可以使用 CloudWatch 来查看您的日志。

所有目前可用的 RDS for PostgreSQL 版本都支持将日志文件发布到 CloudWatch Logs。有关更多信息,请参阅《Amazon RDS for PostgreSQL 版本注释》中的 Amazon RDS for PostgreSQL 更新

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

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

  • Postgresql 日志

  • 升级日志

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

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

  1. 通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/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

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