ちょっと話題の記事

RDS for PostgreSQLのログ設定まとめ

2015.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、虎塚です。

前回は、RDSでのDBアクセスログの管理方法をご紹介しました。今回はもう少し踏み込んで、RDS for PostgreSQLを対象に具体的なログ関連の設定項目についてまとめました。

DBログの取得/運用についての設計をするにあたり、大切なのは「ログの利用目的」です。一方、どんなことを決めてDBの設定に落とす必要があるかを、設定項目からボトムアップで見てみるのも、DBMSを理解する上ではよいかと思います。

DBログ設定の項目を検討する前の前提知識

RDSでは、DBの設定項目をパラメータグループで設定します。ひとつひとつの項目を確認する前に、知っておいたほうがよいことを紹介します。

engine-default値の意味

パタメータグループには、engine-defaultと表示されている設定項目があります。

engine-defaultの設定値

値が「engine-default」になっている設定項目には、RDSのインスタンスクラスやストレージの種別、大きさなどによって決められた値が設定されています。DBの状態に合わせたチューニングが最初からおこなわれているわけですね。AWSならではの細やかな設定で、便利です。

engine-defaultの実際の値を確認する方法

engine-defaultという仕組みは便利ですが、具体的な設定値がManagement Consoleからぱっとわからないのは難点です。engine-defaultの値がどうなっているかは、次の方法で確認します。

RDSへ接続可能な作業環境にPostgreSQLクライアントをインストールし、次のコマンドを実行します。

$ psql -d DATABASE_NAME -h instance-name.abcdef0123456.ap-northeast-1.rds.amazonaws.com  -U USER_NAME -c 'SELECT name,setting,unit FROM pg_settings;' -A -F $'\t' > OUTPUT_FILE

RDSの設定値を一括で取得し、ファイルに保存します。

$ head OUTPUT_FILE
name    setting    unit
allow_system_table_mods    off
application_name    psql
archive_command    /etc/rds/dbbin/pgscripts/rds_wal_archive %p
archive_mode    on
archive_timeout    300    s
[...]

「engine-default」という値が初期値とされている設定項目については、このファイルを参照することで、ご利用中のRDSで設定されている実際の値を知ることができます。

最も重要な設定: rds.log_retention_period

詳細な設定項目を見ていく前に、rds.log_retention_periodを設定しましょう。この値で指定した時間 (分) より古いログは、RDSが削除します。デフォルトでは3日に設定されていて、440分(1日)〜10080分(7日)の間で設定できます。

この設定項目はRDS独自のもので、素のPostgreSQLには存在しません。

RDS for PostgreSQLのログ設定項目

ログに関する設定項目を、次の5つのカテゴリに分けて確認します。

  1. ログの保存に関する設定
  2. いつログを取得するかの設定
  3. 何をログに出力するかの設定
  4. 統計情報のログ設定
  5. 各種デバッグ出力、他の設定

重要な設定項目は太字にして、表の後に補足を記述しました。

1. ログの保存に関する設定

まず、ログをどこにどう保存するかについての設定を確認しましょう。

設定項目 意味 変更可否 RDSのデフォルト 9.4のデフォルト
log_destination ログの出力先 不可 - stderr
logging_collector stderrに送られたログメッセージをキャプチャしてログファイルにリダイレクトする(バックグランドプロセスを有効にする)か 不可 1 -
log_directory ログファイルが作成されるディレクトリ 不可 /rdsdbdata/log/error pg_log
log_filename ログファイル名のパターン。RDSではpostgresql.log.%Y-%m-%d-%Hかpostgresql.log.%Y-%m-%dを選択 postgresql.log.%Y-%m-%d-%H postgresql-%Y-%m-%d_%H%M%S.log
log_file_mode ログファイルのパーミッション 不可 0644 0600
log_rotation_age 指定時間(分)が経過すると新しいログファイルが生成される(1-1440)。0で時間ベースの生成無効。ただし、RDSでは0を選択できない 60 -
log_rotation_size ファイルサイズが指定KBに達すると新しいログファイルが生成される(0-2097151)。0でサイズベースの生成無効 engine-default -
log_truncate_on_rotation ログローテーションの際、既存のファイルに追記せずに上書きする 不可 engine-default 0
syslog_facility syslogを使用する場合のファイシリティの指定 不可 engine-default LOCAL0

特に気をつけるべき設定項目をピックアップします。

log_rotation_age / log_rotation_size

これら2つは、ログのローテーションに関する設定です。注意点として、サイズベースのファイル生成の最小単位は、ログファイル名のパターンに依存します。

上の表のとおり、ログファイル名のパターンを設定するlog_filenameの初期値は「postgresql.log.%Y-%m-%d-%H」です。ここで、log_rotation_ageを「60」に設定すると、60分に1回、ファイル名の末尾に時間(%H)のついたログファイルが生成されます。

ここでさらに、log_rotation_sizeを「1024」に設定したとしましょう。ログファイルのサイズが1024KBに達したら、新しいログファイルを生成する、という設定です。このとき、ログファイル名のパターンに「%H」が含まれていなかった場合、1時間の間に1024KBに達した場合も、新しいファイルが生成されません。

設定項目間の影響を認識した上で、設定値を決めるようにしましょう。

2. いつログを取得するかの設定

次に、いつログを出力させるかの設定を見ていきます。ログレベルの指定がメインですね。

設定項目 意味 変更可否 RDSのデフォルト 9.4のデフォルト
client_min_messages クライアントに送信するメッセージレベル。DEBUG5、 DEBUG4、DEBUG3、DEBUG2、 DEBUG1、LOG、NOTICE、 WARNING、ERROR、FATAL、PANICから選択 engine-default NOTICE
log_min_messages サーバログに出力するメッセージレベル。DEBUG5、DEBUG4、 DEBUG3、DEBUG2、DEBUG1、 INFO、NOTICE、WARNING、 ERROR、LOG、FATAL、PANICから選択 engine-default WARNING
log_min_error_statement エラーを生成するSQL文について、設定レベルより高い場合にログに残す。DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、LOG、FATAL、PANICから選択 engine-default ERROR
log_min_duration_statement 文の実行に指定時間 (ミリ秒) 以上かかった場合、ログに記録する (-1-2147483647) engine-default -1

特に気をつけるべき設定項目をピックアップします。

client_min_messages / log_min_messages

これら2つの設定項目はとても似ていますが、「LOG」レベルの優先順位が異なります。LOGレベル以外の優先順位は同じです。

各ログレベルがどのような意味をもつかは、ドキュメントを参照してください。

log_min_error_statement

エラーになるSQL文を一切ログに出力したくない場合は、log_min_error_statementを「PANIC」を指定します。これによって、エラーになるSQLを実質的に無視できます。

3. 何をログに出力するかの設定

それから、何をログに出力するかの設定を見てみます。ログの利用目的に応じて、設定値を検討します。ログはRDSのストレージに格納されるので、ここでの設定がストレージサイズに効いてくることも考慮します。

設定項目 意味 変更可否 RDSのデフォルト 9.4のデフォルト
application_name アプリケーション名 engine-default -
log_autovacuum_min_duration 指定時間(ミリ秒)よりも長くかかった自動バキュームを記録する (-1-2147483647) engine-default -1
log_checkpoints 各チェックポイント、リスタートポイントを記録するか 1 0
log_connections クライアントからサーバへの接続の成功を記録するか engine-default 0
log_disconnections セッションが持続していた場合、記録するか engine-default 0
log_duration 各SQL文の完了時間を記録するか (クライアントによってはParse、Bind、Executeなどの内訳が記録される) engine-default 0
log_error_verbosity ログの詳細度 (default、tarse、varbose) engine-default default
log_hostname 接続ログに接続元のIPアドレスに加えてホスト名も残すか 1 0
log_line_prefix ログの各行のプリフィックス 不可 %t:%r:%u@%d:[%p]: -
log_lock_waits ロック獲得待ちがdeadlock_timeout設定値より長い場合に記録する engine-default 0
log_statement ログに残すSQL文の種別 (none、ddl、mod、all) engine-default none
log_temp_files 指定値 (kB) 以上のサイズの一時ファイルが削除されたら残す (-1-2147483647, 0なら全部) engine-default -1
log_timezone ログメッセージで使うタイムゾーン 不可 UTC GMT

log_checkpoints

素のPostgreSQLのデフォルト値はoffですが、RDSのデフォルトではonになっています。出力されたバッファ数や所要時間などが記録されます。そういった統計情報を特に出力したくない場合は、値を変更しましょう。

log_error_verbosity

ログメッセージの詳細度の指定です。default、tarse、varboseから選べます。

各レベルでどういった情報が得られるかは、ドキュメントを参照してください。ログ取得の目的を考えて、適切な粒度を選びます。なお、SQLSTATEエラーコードを見たい場合は、varboseを指定する必要があります。

log_hostname

接続ログに接続元のホスト名を残すかどうかを設定します。9.4エンジンとしてのデフォルトはoffですが、RDSではonになっています。パフォーマンスが気になる場合は、offにしたほうがよいかもしれません。

log_line_prefix

ログの各行のプリフィックスです。設定値は固定されていて変更できません。所与の設定値「%t:%r:%u@%d:[%p]:」は、「ミリ秒なしのタイムスタンプ:ホスト名またはIPアドレスとポート番号:ユーザ名@データベース名:[プロセス識別子]:」という形式を意味します。

log_lock_waits

ロック獲得待ちがdeadlock_timeoutの設定値より長い場合に、ログに記録するように設定できます。デフォルトはoffです。

deadlock_timeoutは、素のPostgreSQL 9.4のデフォルトは1秒ですが、RDSではengine-defaultです。log_lock_waitsをオンにする場合、deadlock_timeoutに実際にどんな値が設定されているか確認しましょう。1秒だと短すぎる場合があります。必要に応じてトランザクションタイムを計測して、deadlock_timeoutを適切な値に変えたほうがよいでしょう。

log_statement

どんな種類のSQL文をログに残すか (none、ddl、mod、all)から選択します。modはDDLに加えてデータ変更文も残します。allはSELECTも残します。

構文エラーのあるSQL文をもログに残すには、この値をallに設定するだけでなく、「いつログを取得するかの設定」で記載したlog_min_error_statementをERRORレベルに設定する必要があります。

4. 統計情報のログ設定

さらに、統計情報を出力するためのログ設定を見てみます。チューニングの際に、これらの設定値をonにするとよいでしょう。

設定項目 意味 変更可否 RDSのデフォルト 9.4のデフォルト
log_statement_stats 累積パフォーマンス統計をサーバログに出すか engine-default 0
log_parser_stats パーサーのパフォーマンス統計をサーバログに出すか engine-default 0
log_planner_stats プランナーのパフォーマンス統計をサーバログに出すか engine-default 0
log_executor_stats 実行時のパフォーマンス統計をサーバログに出すか engine-default 0

5. 各種デバッグ出力、他の設定

最後に、デバッグログの出力設定です。

設定項目 意味 変更可否 RDSのデフォルト 9.4のデフォルト
debug_print_parse 各クエリのparseツリーのデバッグ出力を有効にする engine-default 0
debug_print_rewritten 各クエリのrewritten parseツリーのデバッグ出力を有効にする engine-default 0
debug_print_plan 各クエリの実行計画のデバッグ出力を有効にする engine-default 0
debug_pretty_print 上記3つの出力内容を字下げする設定 engine-default 1

おわりに

RDS for PostgreSQLのログ関連の設定をまとめて確認しました。

「たくさん設定項目があるのはわかったけど、パラメータをどう設定したらよいかわからない」という方もいるかもしれません。そういう時は、ログをどういうふうに利用したいかをもう一度考え直してみましょう。ログの利用目的を明確にして、必要十分な記録を保存できるように設定するのが正解です。

ひとつひとつの設定の最適解については、システムの種類やログの用途によるかと思います。PostgreSQLに詳しい方からのご指摘やご意見もお待ちしています。

それでは、また。