ログ関連の設定
NTT オープンソースソフトウェアセンタ 笠原 辰仁
PostgreSQL でのおすすめできるログの設定をお知らせします。ここでいうログとは、PostgreSQL で発生したエラーや警告などの問題を記録するサーバログを指します。ログに関する設定は、PostgreSQLの運用を始める際に最も注意すべきパラメータ設定の一つです。ログは問題発生の有無や問題の原因を切り分ける際に、非常に重要な情報となります。適切なログの運用に向けて、下記を参考にしてみてください。
ログ運用関連のパラメータ設定
PostgreSQLのデフォルト設定(ソースコードからのインストール)では、ログは残さない設定になっています。インストールに使ったパッケージによっては、初めからログを残すよう設定ファイルがカスタマイズされていることもありますが、まずは、確実にログを残すための設定を行いましょう。
ログの運用としては大きく3パターンほどあります。ログ運用は、ログ監視を行う運用監視ツールなど連携する必要が多いため、要件を確認しておきましょう。
- syslogへログを出力する場合
- syslogを用いてロギングする方法です。一般に多用される方法だと思います。ログの制御 (出力先やログファイル名、切り替えなど) はsyslogで行います。
- テキスト形式のログを出力する場合
- PostgreSQL独自の制御でロギングを行います。ログの制御はPostgreSQLで行います。これらの制御はPostgreSQLのパラメータで細かく設定することができます。
- 外部ツールで制御する場合
- 一旦PostgreSQLから標準出力されたメッセージを、パイプ等で外部ツールへ受け渡し、そのツールでロギングを行います。ログの制御は外部ツールの方で行います。あまり見かける方法ではありませんが、リアルタイムでログのフィルタリングを行ったり、syslogやPostgreSQLのロギングでは難しいログの制御が必要な場合に用います。
PostgreSQLのパラメータについては、以下の項目を見ておけば安心です。以下は全てPostgreSQLの設定ファイル (postgresql.conf) のパラメータとなります。設定ファイルは、DBクラスタディレクトリ ($PGDATA) 直下にあります。パターン別に整理します。
パラメータ名 | おすすめの値 |
---|---|
log_destination | 'syslog' |
log_min_error_statement | error |
パラメータ名 | おすすめの値 |
---|---|
log_destination | 'stderr' または 'csv' (ver8.2~) |
redirect_stderr (~ver8.2) logging_collector (ver8.3~) |
'on' |
log_directory | 'pg_log' or '/var/log/pgsql' など |
log_filename | 'postgresql-%Y-%m-%d_%H%M.log'など |
log_line_prefix | '[%t][%p][%u][%d] 'など |
log_rotation_age | '1d'または'1440' (1日単位で切り替え) |
log_rotation_size | 1ログファイルの許容サイズ(大きくても数百MB) |
log_min_error_statement | error |
パラメータ名 | おすすめの値 |
---|---|
log_destination | 'stderr' または 'csv' (ver8.2~) |
redirect_stderr (~ver8.2) logging_collector (ver8.3~) |
'off' |
log_min_error_statement | error |
log_destination / redirect_stderr / logging_collector
ログをどこに出力するのかを設定します。stderr (標準エラー出力)、syslog, csvlog (8.2~)が設定できます ('syslog, stderr' といった複数指定も可能です)。stderr や csvlog を設定した場合は、logging_collector (8.2以前まではredirect_stderr) を有効にすることで、テキストまたは CSV ファイルとしてログが保存されます。
(注意!) Windows には Linux 等の syslog に相当する 'eventlog' の設定がありますが、バージョン 8.4 現在、必ず文字化けを起こします。可能な限り eventlog への出力は避けましょう。
なお、rotatelogsなどの外部ツールでPostgreSQLの出力メッセージをロギングしたい場合は、logging_collectorを無効にして、出力メッセージを外部ツールへ受け渡せるようにして下さい。典型的には、下記の様にパイプで受け渡す方法となるでしょう。
pg_ctl start | rotatelogs /var/log/pgsql_log 86400
log_directory / log_filename
log_destinationを 'stderr' や 'csv' とし、logging_collectorを有効にしてPostgreSQL 独自にロギングする場合に、どのディレクトリにどのような名前でログファイルを出力するかを設定します。ログディレクトリはDBクラスタ ($PGDATA) のディレクトリからの相対パス、あるいは絶対パスで指定できます。ログファイル名には、strftime で利用可能なフォーマット (%Yで西暦、%dで日にちなど) が付与できます。ログファイル名は、切り替えの挙動に影響してきます。詳しくはlog_rotation_age/sizeの項を見てください。
なお、ログファイル名を固定にしたい場合に、log_filename='postgresql.log' としても上手くいきません。PostgreSQLは、log_filenameに%エスケープがない場合、ファイル名の末尾にファイル作成時刻を付与してしまうからです。そのため、ログファイル名を固定にしたい場合、若干イレギュラーな方法ですが、log_filename='postgresql%.log' などのように、無効なフォーマットとなる'%'を付与することで可能です。もしくはlog_filename='postgresql-%C.log' のように%C(世紀)を付与可能であれば、長期固定のファイル名で運用ができます。ただし、この場合ログの切り替えがされないため、ログサイズの肥大化に注意して下さい。
log_line_prefix
出力するログメッセージに付与するプレフィックスを指定します。デフォルトではメッセージのみ出力されるようになっているため、%t (時間)、%u (ユーザ名)、%d (データベース名)、%p (プロセスID) あたりを指定しておくと良いでしょう。なお、log_line_prefix='...△'(三角は半角スペース)とすると、プレフィックスとログメッセージの間隔が少し空いて見やすくなります。
log_rotation_age / log_rotation_size
ログの切り替えの契機を指定するパラメータです。age は時間契機(単位は分)、size はログサイズ契機 (単位はバイト) でログの切り替えを行います。それぞれの設定値を超えるとログの切り替えが起こり、log_filename のフォーマットに沿った名前で、新たなファイルが作成されます。ほとんどの場合では、1日単位で切り替えて運用することが多いでしょう。ただし、不意に大量のメッセージが出力されることも考慮して、サイズ上限を設けておくと良いでしょう。おおよそ数百MBを上限にしておくと、いざという時に巨大なファイルを見なくてすむので安心です。
log_rotarion_ageの切り替え時間は、PostgreSQLの起動した日の0時0分0秒を起点として計算されます。(log_rotation_age=1dとし、夜中の23時55分にPostgreSQLを起動した場合、5分後にログ切り替えが発生するでしょう。)
なお、特にサイズ契機のログ切り替えを行う場合には、log_filenameのフォーマットに注意する必要があります。例えば、log_filename='pg-%Y%m%d.log' 、log_rotation_age=1d(1日)、log_rotation_size=100MBとしましょう。日中帯の1時間の運用でメッセージが大量に出力され、log_rotation_sizeの100MBを超過した場合でも、ログの切り替えがなされません。ログのファイルフォーマットの粒度が1日単位だからです。この場合、次の日の00時00分00秒に新たなファイルが作成されるまで、切り替えがされません。そのため、ログファイルに%H%Mといった時間・分単位のフォーマットをつけておくと、サイズ切り替えが即座に行われるので安全です。もちろん、時間契機の切り替えについても同じことが言えます。
SQLとVACUUMの所要時間のチェック
PostgreSQLでは、SQLやロックなどの処理にかかった時間をログに出力することが可能です。特に、遅いSQL (スロークエリ) や時間のかかっているautovacuumは、日常的にチェックしておき、問題発生の兆候がないかを早めに把握できるようにしておきましょう。
パラメータ名 | おすすめの値 |
---|---|
log_min_duration_statement | 許容できないSQLレスポンス時間など(単位はミリ秒) |
log_autovacuum_min_duration | 20秒 ~ |
log_min_duration_statement
このパラメータに設定した時間(ミリ秒)以上の処理時間を要したSQLは、そのSQL文とその所要時間をログに出力します。遅い処理 (スロークエリ) の把握に有用です。許容できないレスポンス時間を指定しておくと良いでしょう。
可能な限りeventlogへの出力を避け可能な限りeventlogへの出力を避け(注意!) 場合によっては大量のSQL文のメッセージがログに出力されることがありえます。そうなった場合、syslogへログを出すようにしているとそこがボトルネックになり、PostgreSQLの性能劣化につながることがあります。大量のメッセージが出そうな場合は、stderr経由でユーザファイルにログを出力するか、syslog経由での非同期書き込みが可能な方法 (syslog-ngやrsyslogの利用、及びsyslog.confの設定変更) を実施して下さい。
log_autovacuum_min_duration
このパラメータに設定した時間(秒)以上の処理時間を要したautovacuum処理は、その処理で回収したガベージ量などの情報とその所要時間をログに出力します。autovacuum処理に異常な時間を要していないかをチェックするため、数10秒以上かかったautovacuumについて、その時間と処理内容をログに記録しておくと良いでしょう。
外部リンク
その他にも、PostgreSQLでは色々と有用な情報をログに出力することができます。詳しい情報は、JPUGのオンラインマニュアル「エラー報告とログ取得」や「ログファイルの保守」を参考にしてみてください。
- 関連記事:csvlogを用いたスロークエリの分析
- sysklogd: 本家ページ