RDS for PostgreSQLのログ設定まとめ
こんにちは、虎塚です。
前回は、RDSでのDBアクセスログの管理方法をご紹介しました。今回はもう少し踏み込んで、RDS for PostgreSQLを対象に具体的なログ関連の設定項目についてまとめました。
DBログの取得/運用についての設計をするにあたり、大切なのは「ログの利用目的」です。一方、どんなことを決めてDBの設定に落とす必要があるかを、設定項目からボトムアップで見てみるのも、DBMSを理解する上ではよいかと思います。
DBログ設定の項目を検討する前の前提知識
RDSでは、DBの設定項目をパラメータグループで設定します。ひとつひとつの項目を確認する前に、知っておいたほうがよいことを紹介します。
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. ログの保存に関する設定
まず、ログをどこにどう保存するかについての設定を確認しましょう。
設定項目 | 意味 | 変更可否 | 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に詳しい方からのご指摘やご意見もお待ちしています。
それでは、また。
- 参考: エラー報告とログ取得