

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

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


| 参数 | 默认值 | 说明 | 
| --- | --- | --- | 
| log\$1connections | – | 记录每个成功的连接。 | 
| log\$1disconnections | – | 记录每个会话的结束及其持续时间。 | 
| log\$1checkpoints | 1 | 记录每个检查点。 | 
| log\$1lock\$1waits | – | 记录长锁定等待次数。默认情况下，不设置此参数。 | 
| log\$1min\$1duration\$1sample | – | 设置如超出则记录语句示例的最短执行时间（ms）。示例数量使用 log\$1statement\$1sample\$1rate 参数进行设置。 | 
| log\$1min\$1duration\$1statement | – | 任何至少运行指定时间或更长时间的 SQL 语句都会被记录下来。默认情况下，不设置此参数。开启该参数可帮助查找未优化的查询。 | 
| log\$1statement | – | 设置所记录的语句类型。默认情况下，未设置此参数，但您可以将其更改为 `all`、`ddl` 或 `mod`，以指定要记录的 SQL 语句的类型。如果您为此参数指定了与 `none` 不同的任何值，还应采取其他措施来防止日志文件中的密码泄露。有关更多信息，请参阅 [降低使用查询日志记录时泄露密码的风险降低密码泄露风险](#USER_LogAccess.Concepts.PostgreSQL.Query_Logging.mitigate-risk)。 | 
| log\$1statement\$1sample\$1rate | – | 超过在 `log_min_duration_sample` 中指定的时间的语句百分比，以介于 0.0 和 1.0 之间的浮点值表示。 | 
| log\$1statement\$1stats | – | 向服务器日志写入累计性能统计数据。 | 

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

您可以记录 SQL 语句和查询，以帮助查找执行缓慢的查询。您可以通过修改本节中概述的 `log_statement` 和 `log_min_duration` 参数的设置来开启此功能。在为 RDS for PostgreSQL 数据库实例开启查询日志记录之前，您应该了解日志中可能存在的密码泄露以及如何降低风险。有关更多信息，请参阅 [降低使用查询日志记录时泄露密码的风险降低密码泄露风险](#USER_LogAccess.Concepts.PostgreSQL.Query_Logging.mitigate-risk)。

接下来，您可以了解有关 `log_statement` 和 `log_min_duration` 参数的参考信息。log\$1statement

此参数指定应发送到日志的 SQL 语句的类型。默认值为 `none`。如果您将此参数更改为 `all`、`ddl` 或 `mod`，请务必采取建议的操作来降低在日志中泄露密码的风险。有关更多信息，请参阅 [降低使用查询日志记录时泄露密码的风险降低密码泄露风险](#USER_LogAccess.Concepts.PostgreSQL.Query_Logging.mitigate-risk)。

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

**ddl**  
记录所有数据定义语言（DDL）语句，例如 CREATE、ALTER、DROP 等。

**mod**  
记录所有可修改数据的 DDL 语句和数据操作语言（DML）语句，例如 INSERT、UPDATE 和 DELETE。

**none**  
不记录任何 SQL 语句。我们建议使用此设置，以避免在日志中泄露密码的风险。log\$1min\$1duration\$1statement

任何至少运行指定时间或更长时间的 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 ----------------------
   ```

1. 设置 `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` 设置为 `all`、`ddl` 或 `mod`，我们建议您采取以下一个或多个步骤。
+ 对于客户端，加密敏感信息。有关更多信息，请参阅 PostgreSQL 文档中的[加密选项](https://www.postgresql.org/docs/current/encryption-options.html)。使用 `ENCRYPTED` 和 `UNENCRYPTED` 语句的 `CREATE`（和 `ALTER`）选项。有关更多信息，请参阅 PostgreSQL 文档中的 [CREATE USER](https://www.postgresql.org/docs/current/sql-createuser.html)。
+ 对于您的 RDS for PostgreSQL 数据库实例，请设置并使用 PostgreSQL Auditing（pgAudit）扩展。此扩展编辑发送到日志的 CREATE 和 ALTER 语句中的敏感信息。有关更多信息，请参阅 [使用 pgAudit 记录数据库活动](Appendix.PostgreSQL.CommonDBATasks.pgaudit.md)。
+ 限制对 CloudWatch Logs 的访问。
+ 使用更强的身份验证机制，如 IAM。