

# RDS for PostgreSQL DB インスタンスのクエリログ記録をオンにする
<a name="USER_LogAccess.Concepts.PostgreSQL.Query_Logging"></a>

次のテーブルに示すパラメータの一部を設定することで、クエリ、ロック待ちのクエリ、チェックポイント、その他多くの詳細を含む、データベースアクティビティに関するより詳細な情報を収集できます。このトピックでは、クエリのログ記録に焦点を当てます。


| パラメータ  | デフォルト | 説明  | 
| --- | --- | --- | 
| 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 | – | 累積処理のパフォーマンスの統計情報をサーバーログに書き込みます。 | 

## ログ記録を使用してパフォーマンスの低いクエリを見つける
<a name="USER_LogAccess.Concepts.PostgreSQL.Query_Logging.using"></a>

SQL ステートメントとクエリをログに記録すると、パフォーマンスの悪いクエリを見つけるのに役立ちます。この機能を有効にするには、このセクションで説明されているとおり、`log_statement` および `log_min_duration` パラメータの設定を変更します。 RDS for PostgreSQL DB インスタンス、のクエリログ記録を有効にする前に、ログにパスワードが漏洩する可能性と、そのリスクを軽減する方法について知っておく必要があります。詳細については、「[クエリのログ記録を使用する際のパスワード漏洩リスクの軽減パスワード漏洩リスクの軽減](#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**  
CREATE、ALTER、DROP などのすべてのデータ定義言語 (DDL) ステートメントをログに記録します。

**mod**  
データを変更する DDL ステートメントと、INSERT、UPDATE、DELETE などのデータ操作言語 (DML) ステートメントをすべてログに記録します。

**なし**  
SQL ステートメントはログに記録されません。ログにパスワードが漏れてしまうリスクを避けるため、この設定をお勧めします。log\$1min\$1duration\$1statement

少なくとも指定された時間以上実行された SQL ステートメントはすべてログに記録されます。デフォルトでは、このパラメータは設定されていません。このパラメータを有効にすると、最適化されていないクエリを見つけるために役立ちます。

**–1–2147483647**  
ステートメントがログに記録される実行時間のミリ秒 (ms) 数。

**クエリのログ記録を設定するには**

これらのステップは、RDS for PostgreSQL DB インスタンスはカスタム DB パラメータグループを使用します。

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` パラメータで指定された期間を超えるクエリはログに記録されます。例を以下に示します。 RDS for PostgreSQL DB インスタンスのログファイルは Amazon RDS コンソールで表示できます。

   ```
   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 ----------------------
   ```

### クエリのログ記録を使用する際のパスワード漏洩リスクの軽減
<a name="USER_LogAccess.Concepts.PostgreSQL.Query_Logging.mitigate-risk"></a>

パスワードが漏洩しないように、`log_statement` を `none` に設定したままにしておくことをお勧めします。`log_statement` を `all`、`ddl`、または `mod` に設定した場合は、次の手順を 1 つ以上実行することをお勧めします。
+ クライアントの場合は、機密情報を暗号化します。詳細については、PostgreSQL ドキュメントの「[暗号化オプション](https://www.postgresql.org/docs/current/encryption-options.html)」を参照してください。`CREATE` および `ALTER` ステートメントの `ENCRYPTED` (および`UNENCRYPTED`) オプションを使用してください。詳細については、PostgreSQL のドキュメントの「[CREATE USER](https://www.postgresql.org/docs/current/sql-createuser.html)」を参照してください。
+  RDS for PostgreSQL DB インスタンスでは 、PostgreSQL 監査 (pgAudit) 拡張機能をセットアップして使用します。この拡張機能は、ログに送信された CREATE および ALTER ステートメントの機密情報を編集します。詳細については、「[pgAudit を使用してデータベースのアクティビティを記録する](Appendix.PostgreSQL.CommonDBATasks.pgaudit.md)」を参照してください。
+ CloudWatch ログへのアクセスを制限します。
+ IAM など、より強力な認証メカニズムを使用してください。