PostgreSQL 数据库日志文件
RDS for PostgreSQL 生成查询和错误日志。在使用数据库时,可以使用日志消息来排查性能和审计问题。
要查看、下载和观看基于文件的数据库日志,请参阅监控 Amazon RDS 日志文件。
PostgreSQL 日志概述
PostgreSQL 会生成事件日志文件,其中包含对数据库管理员有用的信息。
日志内容
默认的日志记录级别会捕获影响服务器的错误。默认情况下,Amazon RDS PostgreSQL 日志记录参数会捕获所有服务器错误,包括以下内容:
-
查询失败
-
登录失败
-
致命的服务器错误
-
死锁数
要确定应用程序问题,可以使用上述错误消息。例如,如果您将旧版应用程序从 Oracle 转换为 Amazon RDS PostgreSQL,部分查询可能无法正确转换。这些格式错误的查询会在日志中生成错误消息,您可以使用这些错误消息来识别有问题的代码。
您可以修改 PostgreSQL 日志记录参数来捕获其他信息,包括以下内容:
-
连接和断开
-
检查点
-
架构修改查询
-
等待锁定的查询
-
使用临时磁盘存储的查询
-
消耗资源的后端 Autovacuum 流程
上述日志信息可以帮助排查潜在的性能和审计问题。有关更多信息,请参阅 PostgreSQL 文档中的错误报告和日志记录
参数组
每个 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_statement 和 log_min_duration_statement。
log_statement 参数控制需要记录的 SQL 语句。默认值为 none。建议您在数据库实例中调试问题时,将此参数设置为 all。要记录所有数据定义语言 (DDL) 语句(CREATE、ALTER、DROP 等),请将此值设置为 ddl。要记录所有 DDL 和数据修改语言 (DML) 语句(INSERT、UPDATE、DELETE 等),请将此值设置为 mod。
如果将 log_statement 参数设置为 ddl、mod 或 all,可能会暴露密码等敏感信息。要避免带来此风险,请将 log_statement 设置为 none。此外,还可以考虑以下解决方案:
-
对客户端的敏感信息进行加密,然后使用
ENCRYPTED和UNENCRYPTED语句的CREATE和ALTER选项。 -
限制对 CloudWatch Logs 的访问。
-
使用更强的身份验证机制,如 IAM。
对于审计,您可以使用 PostgreSQL pgAudit 扩展,因为它会编辑 CREATE 和 ALTER 命令的敏感信息。
log_min_duration_statement 参数设定需要记录的语句的限制 (以毫秒为单位)。所有运行时间长于该参数设置的 SQL 语句都会被系统记录。默认情况下,该参数处于禁用状态并设置为 -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:设置
log_min_duration_statement参数。以下示例显示了参数设置为postgres.log时写入1文件的信息。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/ 中。要查看您的日志,请在 https://console.aws.amazon.com/cloudwatch/my_instance/postgresql
使用控制台将 PostgreSQL 日志发布到 CloudWatch Logs
通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择 Databases (数据库)。
-
选择要修改的数据库实例,然后选择 Modify (修改)。
-
在 Log exports (日志导出) 部分中,选择要开始发布到 CloudWatch Logs 的日志。
Log exports (日志导出) 部分仅适用于支持发布到 CloudWatch Logs 的 PostgreSQL 版本。
-
选择继续,然后选择摘要页面上的修改数据库实例。
您可以使用 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,其值是具有 postgresql 和 upgrade 的任意组合的字符串的数组。
对于 Linux、macOS 或 Unix:
aws rds modify-db-instance \ --db-instance-identifiermydbinstance\ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["postgresql", "upgrade"]}'
对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifiermydbinstance^ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["postgresql","upgrade"]}'
例 创建实例以将日志发布到 CloudWatch Logs
以下示例将创建一个 PostgreSQL 数据库实例并将日志文件发布到 CloudWatch Logs。--enable-cloudwatch-logs-exports 值是 JSON 字符串数组。这些字符串可以是 postgresql 和 upgrade 的任意组合。
对于 Linux、macOS 或 Unix:
aws rds create-db-instance \ --db-instance-identifiermydbinstance\ --enable-cloudwatch-logs-exports '["postgresql","upgrade"]' \ --db-instance-classdb.m4.large\ --enginepostgres
对于 Windows:
aws rds create-db-instance ^ --db-instance-identifiermydbinstance^ --enable-cloudwatch-logs-exports '["postgresql","upgrade"]' ^ --db-instance-classdb.m4.large^ --enginepostgres
您可以使用 RDS API 来发布 PostgreSQL 日志。您可以使用以下参数调用 ModifyDBInstance 操作:
-
DBInstanceIdentifier -
CloudwatchLogsExportConfiguration
对 CloudwatchLogsExportConfiguration 参数进行的更改始终立即应用于数据库实例。因此,ApplyImmediately 参数没有影响。
您还可以通过调用以下 RDS API 操作来发布 PostgreSQL 日志:
使用以下参数运行这些 RDS API 操作之一:
-
DBInstanceIdentifier -
EnableCloudwatchLogsExports -
Engine -
DBInstanceClass
根据您运行的操作,可能需要其他参数。