PostgreSQL データベースのログファイル - Amazon Relational Database Service

PostgreSQL データベースのログファイル

RDS for PostgreSQL では、クエリおよびエラーログが生成されます。データベースの使用中に、ログメッセージを使用して、パフォーマンスおよび監査の問題をトラブルシューティングできます。

ファイルベースのデータベースログを表示、ダウンロード、およびモニタリングするには、「Amazon RDS ログファイルのモニタリング」を参照してください。

PostgreSQL ログの概要

PostgreSQL は、DBA に役立つ情報を含むイベントログファイルを生成します。

ログの内容

デフォルトのログレベルでは、サーバーに影響するエラーがキャプチャされます。デフォルトでは、Amazon RDS PostgreSQL ログパラメータは、以下を含むすべてのサーバーエラーをとらえます。

  • クエリの失敗

  • ログインエラー

  • 致命的なサーバーエラー

  • デッドロック

アプリケーションの問題を特定するには、ログでクエリの失敗、ログインの失敗、デッドロック、および致命的なサーバーエラーを探すことができます。例えば、従来のアプリケーションを Oracle から Amazon RDS PostgreSQL に変換した場合、一部のクエリが正しく変換されないことがあります。これらの誤った形式のクエリは、ログにエラーメッセージを生成し、問題のあるコードを識別するために使用することができます。

PostgreSQL ログパラメータを変更して、次のようなカテゴリに基づく追加情報をキャプチャできます。

  • 接続と接続解除

  • チェックポイント

  • スキーマ変更クエリ

  • ロック機能を備えているクエリ

  • テンポラリディスクストレージを使用するクエリ

  • リソースを使用するバックエンド autovacuum プロセス

リストに示されているようなさまざまなカテゴリの情報をログに記録することで、潜在的なパフォーマンス問題や監査の問題をトラブルシューティングできます。詳細については、PostgreSQL ドキュメントの Error reporting and logging を参照してください。PostgreSQL ログに関する有用な AWS ブログについては、Working with RDS and Aurora PostgreSQL logs: Part 1 および Working with RDS and Aurora PostgreSQL logs: Part 2 を参照してください。

ロギング動作に影響するパラメータ

Amazon RDS PostgreSQL インスタンスには、ロギングのさまざまな側面を含め、設定を指定するパラメータグループがあります。デフォルトのパラメータグループ設定は、特定の AWS リージョン 内のすべての RDS for PostgreSQL DB インスタンスに適用されます。デフォルトは、特定のエンジンのすべてのインスタンスに適用され、自分のものではないインスタンスにも適用されるため、変更できません。パラメータの値を変更するには、カスタムパラメータグループを作成して、その設定を変更します。例えば、ロギングパラメータを設定または変更するには、 RDS for PostgreSQL DB インスタンスに関連付けられているカスタムパラメータグループを変更します。この方法の詳細は、「パラメータグループを使用する」を参照してください。

RDS for PostgreSQL DB インスタンスの場合、ロギング動作に影響するパラメータは次のとおりです。

  • rds.log_retention_period — 指定した時間 (分) より古い PostgreSQL ログは削除されます。デフォルト値の 4,320 分では、3 日後にログファイルが削除されます。詳細については、「ログの保持期間の設定」を参照してください。

  • log_rotation_age — Amazon RDS がログを自動的にローテーションするまでの時間を分単位で指定します。デフォルトは 60 分ですが、1~1,440 分の任意の値を指定できます。詳細については、「ログファイルのローテーションの設定」を参照してください。

  • log_rotation_size — Amazon RDS がログを自動的にローテーションするサイズをキロバイト単位で設定します。ログは log_rotation_age パラメータによって指定された期間だけに基づいてローテーションされるため、デフォルト値はありません。詳細については、「ログファイルのローテーションの設定」を参照してください。

  • log_line_prefix - ログに記録される各行の前に接頭辞が付けられる情報を指定します。このパラメータのデフォルトの文字列は %t:%r:%u@%d:[%p]: であり、ログエントリの時刻 (%t) や、データベース名 (%d) など、その他の識別特性を記述します。このパラメータは変更できません。ログに記録される stderr メッセージに適用されます。

  • log_destination — サーバーログの出力形式を設定します。このパラメータのデフォルト値は標準エラー (stderr) ですが、csvlog (カンマ区切り値のログファイル) もサポートされています。詳細については、「ログの送信先の設定」を参照してください。

ログの保持期間の設定

システムログの保持期間を設定するには、 rds.log_retention_period パラメータを使用します。rds.log_retention_period は、DB インスタンス に関連付けられている DB パラメータグループで確認できます。このパラメータは分単位です。例えば、1,440 に設定すると、ログは 1 日保持されます。デフォルト値は 4,320 (3 日間) です。最大値は 10,080 (7 日間) です。インスタンスには、保持するログファイルを格納するだけの十分な割り当てストレージが必要です。

ログを定期的に Amazon CloudWatch Logs に公開することをお勧めします。これにより、ログが RDS for PostgreSQL DB インスタンスから削除された後も、システムデータを表示して分析することができます。詳細については、「Amazon CloudWatch Logs への PostgreSQL ログの発行」を参照してください。

ログファイルのローテーションの設定

新しいログファイルは、デフォルトでは、Amazon RDS によって 1 時間ごとに作成されます。このタイミングは、log_rotation_age パラメータによって制御されます。このパラメータのデフォルト値は 60 (分) ですが、1 分から 24 時間 (1,440 分) までの任意の時間に設定できます。ローテーションの時期になると、新しい個別のログファイルが作成されます。ファイルには、log_filename パラメータによって指定されたパターンに従って名前が付けられます。

ログファイルは、log_rotation_size パラメータで指定されたサイズに従ってローテーションすることもできます。このパラメータは、ログがサイズ (キロバイト単位) に達したときにローテーションされるように指定します。RDS for PostgreSQL DB インスタンスの場合、log_rotation_size は未設定です。つまり、値が指定されていません。ただし、このパラメータでは 0~2,097,151 KB (キロバイト) の設定が可能です。

ログファイル名は、log_filename パラメータで指定されるファイル名のパターンに基づきます。次のように、1 時間あたり、または 1 分あたりのファイル名を指定できます。

  • postgresql.log.%Y-%m-%d-%H%M — 分形式のログファイル名。ログの粒度を 1 時間未満に設定します。PostgreSQL バージョン以上でのみサポートされています。

  • postgresql.log.%Y-%m-%d-%H — 時間形式のログファイル名。ログの粒度を時間単位に設定します。

log_rotation_age パラメータを 60 分未満に設定した場合は、log_filename パラメータも分形式に設定します。

詳細については、PostgreSQL ドキュメントの「log_rotation_age」と「log_rotation_age」を参照してください。

ログの送信先の設定

デフォルトでは、 Amazon RDS PostgreSQL はスタンダードエラー (stderr) 形式でログを生成します。これは、log_destination パラメータのデフォルト設定です。この形式では、各ログメッセージに時刻、データベース、および log_line_prefix パラメータで指定されたその他の詳細がプレフィックスとして付加されます。log_line_prefix は次のテキスト文字列に設定されていて、変更できません。

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

このパラメータは、各ログエントリについて次の詳細を指定します。

  • %t — ログエントリの時刻。

  • %r - リモートホストのアドレス。

  • %u@%d — ユーザー名 @ データベース名。

  • [%p] — プロセス 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

RDS for PostgreSQL は、デフォルトの stderr に加えて、log_destination パラメータによって指定された csvlog 形式でログを生成できます。csvlog は、ログデータを CSV データとして分析する場合に便利です。例えば、log_fdw 拡張機能を使用して外部テーブルとしてログを使用するとします。stderr ログファイルについて作成された外部テーブルには、ログイベントデータを含む 1 つの列が含まれます。CSV 形式のログファイルの場合、外部テーブルには複数の列があるため、ログをはるかに簡単にソートおよび分析できます。log_fdwcsvlog を指定して使用する方法については、「SQL を使用した DB ログのアクセスのための log_fdw 拡張機能の使用」を参照してください。

log_destination 設定を変更するには、カスタムパラメータグループを使用する必要があります。log_destination パラメータは動的です。つまり、変更は再起動せずにすぐに有効になります。

このパラメータを変更する場合は、stderr ログに加えて csvlog ファイルが生成されることに注意する必要があります。ログによって消費されるストレージに注意し、ログのストレージと回転率に影響する rds.log_retention_period とその他の設定を考慮することをお勧めします。stderrcsvlog の両方を使用すると、ログで消費されるストレージが 2 倍以上になります。

csvlog を含むように log_destination を設定し、後で、デフォルトのみ (stderr) に戻すと決めた場合は、AWS Management Console を使用して、インスタンスのカスタムパラメータグループを開き、リストから log_destination パラメータを選択して、[Edit parameter] (パラメータの編集) を選択し、[Reset] (リセット) を選択します。これにより、log_destination パラメータがデフォルト設定の stderr に戻ります。

ログの設定の詳細については、「Amazon RDS および Aurora PostgreSQL ログの操作:パート 1」を参照してください。

クエリログの有効化

PostgreSQL DB インスタンスのクエリログ記録を有効にするには、DB インスタンスに関連付けられている DB パラメータグループの 2 つパラメータ、log_statement および log_min_duration_statement を設定します。

log_statement パラメータでは、どの SQL ステートメントをログに記録するかを制御します。デフォルト値は none です。DB インスタンスで問題をデバッグするときは、このパラメータを all に設定して、すべてのステートメントをログに記録することをお勧めします。すべてのデータ定義言語 (DDL) ステートメント (CREATE、ALTER、DROP など) をログに記録するには、この値を ddl に設定します。すべての DDL とデータ変更言語 (DML) ステートメント (INSERT、UPDATE、DELETE など) をログに記録するには、値を mod に設定します。

警告

log_statement パラメータを ddlmod、または all に設定すると、パスワードなどの機密情報が公開されます。このリスクを回避するには、log_statementnone に設定します。以下の解決方法も検討してください。

  • クライアント側で機密情報を暗号化し、ENCRYPTED および UNENCRYPTED ステートメントの CREATE および ALTER オプションを使用します。

  • CloudWatch ログへのアクセスを制限します。

  • IAM など、より強力な認証メカニズムを使用してください。

監査には、PostgreSQL Auditing (pgAudit) エクステンションを使用できます。これは、CREATE コマンドと ALTER コマンドの機密情報を編集するためです。

log_min_duration_statement パラメータでは、ログに記録するステートメントの制限をミリ秒単位で設定します。このパラメータで設定した時間より長く実行されたすべての SQL ステートメントがログに記録されます。このパラメータはデフォルトでは無効になっており、-1 に設定されています。このパラメータを有効にすると、最適化されていないクエリを見つけるために役立ちます。

クエリログ記録を設定するには、次のステップに従います。

  1. log_statement パラメータを all に設定します。以下の例に示しているのは、postgresql.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"

    クエリを実行すると、追加の情報が postgresql.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:
  2. log_min_duration_statement パラメータを設定します。以下の例に示しているのは、パラメータを postgresql.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"

    クエリを実行して、その実行時間がこのパラメータの値を超えていると、追加の情報が postgresql.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

Amazon CloudWatch Logs への PostgreSQL ログの発行

PostgreSQL ログレコードを高い耐久性の高いのストレージに保存するには、Amazon CloudWatch Logs を使用できます。CloudWatch Logs では、ログデータのリアルタイム分析を実行したり、CloudWatch を使用してメトリクスを表示したり、アラームを作成したりすることもできます。例えば、log_statementsddl に設定した場合、DDL ステートメントが実行されるたびに警告するアラームを設定できます。

CloudWatch Logs を操作するには、ログデータをロググループに発行するように PostgreSQL DB インスタンス用 RDS を設定します。

注記

CloudWatch Logs へのログファイルの発行は、PostgreSQL バージョン 9.6.6 以上、PostgreSQL 10.4 以上およびそれ以降のすべてのリリースでサポートされています。

RDS for PostgreSQL では、次のログの種類を CloudWatch Logs に発行できます。

  • Postgresql ログ

  • アップグレードログ (Aurora PostgreSQL では使用できません)

設定が完了すると、Amazon RDS はログイベントを CloudWatch ロググループのログストリーミングに発行します。例えば、PostgreSQL ログデータは /aws/rds/instance/my_instance/postgresql ロググループに保存されます。ログを表示するには、https://console.aws.amazon.com/cloudwatch/ で CloudWatch コンソールを開きます。

コンソールを使用して CloudWatch Logs に PostgreSQL ログを発行するには

  1. Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、[データベース] を選択します。

  3. 変更する DB インスタンスを選択してから、[変更] を選択します。

  4. [ログのエクスポート] セクションで、CloudWatch Logs に公開するログを選択します。

    [ログのエクスポート] セクションは、CloudWatch Logs への発行をサポートしている PostgreSQL バージョンでのみ使用できます。

  5. [続行] を選択し、概要ページで [Modify DB Instance] (DB インスタンスの変更) を選択します。

PostgreSQL ログは、AWS CLI を使用して発行することができます。以下のパラメータを使用して、modify-db-instance コマンドを呼び出せます。

  • --db-instance-identifier

  • --cloudwatch-logs-export-configuration

注記

--cloudwatch-logs-export-configuration オプションへの変更は常に DB インスタンスに即時適用されます。それで、--apply-immediately--no-apply-immediately オプションは効果がありません。

以下の CLI コマンドを呼び出すことで PostgreSQL ログを発行することもできます。

以下のオプションを使用して、これらの CLI コマンドの 1 つを実行します。

  • --db-instance-identifier

  • --enable-cloudwatch-logs-exports

  • --db-instance-class

  • --engine

実行する CLI コマンドに応じて、他のオプションが必要となる場合があります。

例 CloudWatch Logs にログを発行するようにインスタンスを変更する

次の例では、ログファイルが CloudWatch Logs に発行されるよう既存の PostgreSQL DB インスタンスを変更します。--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 DB インスタンスを作成してログファイルを 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

PostgreSQL ログは、RDS API を使用して発行することができます。以下のパラメータを使用して、ModifyDBInstance アクションを呼び出せます。

  • DBInstanceIdentifier

  • CloudwatchLogsExportConfiguration

注記

CloudwatchLogsExportConfiguration パラメータへの変更は常に DB インスタンスに即時適用されます。それで、ApplyImmediately パラメータは効果がありません。

以下の RDS API オペレーションを呼び出すことで PostgreSQL ログを発行することもできます。

以下のパラメータでこの RDS API オペレーションの 1 つを実行します。

  • DBInstanceIdentifier

  • EnableCloudwatchLogsExports

  • Engine

  • DBInstanceClass

実行するオペレーションに応じて、他のパラメータが必要となる場合があります。