はじめての人もそうでない人もはじめまして。河野と申します。
Advent Calendar も中頃、私は3回目に突入しました。
さて、本日は「PostgreSQLのログをデバッグに活用しよう」というお話を皆様にしたいと思います。
ログを見る前に
さっそくログを見ていきたいところですが、まずはログの出力が行われているか確認します。
ログの出力先はOSやサーバによって違うかと思いますが、今回は以下のように設定されているものとします。
postgresql.conf
#log_destination = 'stderr'
redirect_stderr = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1440
log_rotation_size = 0
ざっくり言うと…
標準出力にログを吐き出し、吐き出されたログは pg_log 以下の postgresql-曜日.log へ保存。
ログは 1日ごとにローテーションするという設定です。
ざっくりすぎま…せんよね?
ちなみに「log_destination」を syslog に設定することで syslog を利用する事が可能ですが、メッセージの一部が syslog では出力されない可能性があるため信頼性は高くありません。
Linux であれば基本的に「log_destination」を stderr に。
「redirect_stderr」を on に設定して PostgreSQL にログローテーションまで任せましょう。
何を出力するか
さっそくログを見ていきたいところですが、まずは何を出力するか設定します。
デバッグに役立つ設定値をかいつまんで、紹介差し上げたいと思います。
● エラーのSQLを記録
SQLにエラーが発生した場合、エラーとなったSQLをログに出力したい時、以下の設定を error に設定することでログに保存できます。
開発中やテスト時には error に設定を変更する事をおすすめします。
私のサーバではデフォルトで panic となっていました。
これはエラー時もログを出力しない設定となります。
#log_min_error_statement = panic
● 時間のかかるSQLを記録
複雑なSQLやインデックスの貼り忘れ、テーブルの結合など、色々な条件が原因でレスポンスがなかなか帰って来ないことがあります。
その原因となったSQLを知りたい場合は「log_min_duration_statement」の設定をしましょう。
デフォルトでは -1 無効となっています。
ここの設定値はミリ秒単位ですので30秒ならば 30000 と設定しましょう。
#log_min_duration_statement = -1
データが少ない開発時より、運用されてからこの設定が生きてくることもあるかと思います。
● クライアントからの接続・切断を記録
ひとつのデータベースを複数のアプリケーションで参照する場合、以下の設定を行っておくと接続元のIPが記録されるため、どこからの接続が多いかがログから判断できます。
デフォルトでは off となっています。
有効にする場合は on に設定してください。
#log_connections = off
#log_disconnections = off
もし PostgreSQL の最大接続数に達するほど接続数が増えている場合は、安易に max_connections を増やさずにログを見てから判断しましょう。
● すべてのSQLを記録する
とにかく全てのSQLを記録したい。
レガシーなプログラムのデバッグでは有用になってくるかもしれない設定です。
そのようなプログラムのデバッグをせねばならない状況…お察しします。
この設定値で頑張ってください!
デフォルトでは none となっています。
全て出力したい場合は all と設定してください。
#log_statement = 'none'
PostgreSQLのログをデバッグに活用しよう
いかがでしたでしょうか?
データベース設計や運用・保守はメインではない(とお考えの)開発者ですとデータベースのログを見ることはあまり無いのではと思います。
とくに最近のフレームワークはいい具合にSQLのログなどを出力してくれる為、開発中は見なかったなんて方もいるかも…。
ログは運用されてから発生してくる問題の原因究明にこそ役立ちます(だから開発中見なかったはダメw)
さて、ログの設定は終わりましたか?
では、さっそくログを見ていきましょう!