Aurora PostgreSQL 数据库日志文件 - Amazon Aurora

Aurora PostgreSQL 数据库日志文件

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

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

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

影响日志记录行为的参数

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

参数 默认值 描述

log_destination

stderr

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

log_filename

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

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

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 转换为 Aurora PostgreSQL,但部分查询可能未正确转换。这些格式不正确的查询会生成错误消息,您可以在日志中找到这些错误消息以帮助识别问题。有关日志记录查询的更多信息,请参阅 为您的 Aurora PostgreSQL 数据库集群开启查询日志记录

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

设置日志保留期

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

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

在数据库实例的存储达到阈值时,Amazon Aurora 会压缩较旧的 PostgreSQL 日志。Aurora 使用 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.

设置日志文件轮换

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

也可以根据日志文件的大小进行轮换(如 log_rotation_size 参数指定)。此参数指定在日志达到指定的大小(以千字节为单位)时应轮换日志。对于 Aurora PostgreSQL 数据库集群,原定设置 log_rotation_size 为 100000KB(千字节),但您可以将此值设置为 50000 到 1000000 KB 之间的任意值。

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

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

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

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

如果您将 log_rotation_age 参数设置为小于 60 分钟,则将 log_filename 参数设置为分钟格式。

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

设置日志目标(stderrcsvlog

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

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

如果您为此参数指定 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(如果有)

为您的 Aurora PostgreSQL 数据库集群开启查询日志记录

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

参数 默认值 描述

log_connections

记录每个成功的连接。要了解如何将此参数与 log_disconnections 结合使用来检测连接流失,请参阅 使用池管理 Aurora PostgreSQL 连接流失

log_disconnections

记录每个会话的结束及其持续时间。要了解如何将此参数与 log_connections 结合使用来检测连接流失,请参阅 使用池管理 Aurora PostgreSQL 连接流失

log_checkpoints

1

记录每个检查点。

log_lock_waits

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

log_min_duration_sample

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

log_min_duration_statement

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

log_statement

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

log_statement_sample_rate

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

log_statement_stats

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

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

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

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

log_statement

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

全部

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

ddl

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

mod

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

none

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

log_min_duration_statement

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

–1–2147483647

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

设置查询日志记录

这些步骤假设您的 Aurora 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 控制台中查看 Aurora 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

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

  • 限制对 CloudWatch Logs 的访问。

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