PostgreSQLのログの残し方 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

テーマ:

PostgreSQLにはクライアントが実行したSQLやプロセスに関する各種情報をログファイルに書き出す機能がありますが、デフォルトではオフになっています。

平時はそれでも問題ないですが、システムに異常が発生した場合にそれらのログファイルを参照した方が問題を早く取り除く事ができます。


ここでは、PostgreSQLのログのとり方の基本的なところについて触れて見たいと思います。

なお、設定するPostgreSQLのバージョンは7.4、プラットフォームはRedHatES4です。



1. PostgreSQLの設定ファイル(postgresql.conf)の編集


まずは、PostgreSQLの設定ファイルを編集して、ログを出力するようにセットします。

編集するファイルは、postgresql.confファイルです。

下記のように編集します。


#---------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#---------------------------------------------------------------------------

# - Syslog -

syslog = 1 # range 0-2; 0=stdout; 1=both; 2=syslog
syslog_facility = 'LOCAL5'
syslog_ident = 'postgres'



PostgreSQLのログの出力は、syslogを経由して指定のファイルに書き込まれます。

「syslog_facility」は、そのsyslogがメッセージを出力する際の分類名です。

syslogに関しての詳細は、下記を参照してみてください。


第3回 システム管理の基礎 syslogdの設定をマスターしよう / @IT


ここでは、「LOCAL5」というファシリティを使用していますが、もし他のアプリケーション等で使用している場合は他の(LOCAL0~LOCAL7)を指定します。


PosrgreSQLにおけるログの出力設定は、これだけでも出力されるようになるのですが、このままだとDBの停止やプロセスの大きな問題が発生した場合などしかログに出力されません。

ログを詳細に取りたい場合は、postgresql.conf内のパラメータを変更する事で対応可能です。

ログの出力レベルを変更したいのであれば


log_min_messages = notice


の箇所を変更します。

詳細は、マニュアル を参照。(16.4.5. エラー報告とロギング)


また、「log_min_messages」で設定する以外にも、DBに対して発行されたSQL文自体をログに出力したければ、


log_statement = true


※ PostgreSQL8からは、指定のSQL文だけログに出力させると言う事が可能ですが、バージョン7では全てのSQLを

  指定するしかオプションがありません。


と設定し、DBのコネクション情報をログに取りたければ


log_connections = true


とすることで、対応が可能です。

何れも設定すると大量の情報がログファイルに出力されますので、ディスクの容量に注意が必要です。

また、パフォーマンスの劣化を招く事にもなりますので、取る必要がある項目に絞って設定します。



2. syslogの設定ファイル(syslog.conf)の編集

先ほど説明したとおりPostgreSQLのログの出力は、syslog経由で行われます。

ですので、次はsyslogの設定を変更しPostgreSQLのログの出力を受け取れるように設定する必要があります。

syslogの設定ファイルは、syslog.confで/etcにあります。

下記の一行をsyslog.confの最後に追記します。


# PostgreSQL Log
local5.* /var/log/pgsql


ファシリティはPostgreSQLの設定ファイルで設定したものと併せる必要があります。

また、出力先のログファイルは何処でも指定可能です。



3. PostgreSQLとsyslogプロセスの再起動


設定を反映させる為に、プロセスを再起動します。

まずは、syslogプロセスの再起動をします。


# /etc/init.d/syslog restart
カーネルロガーを停止中: [ OK ]
システムロガーを停止中: [ OK ]
システムロガーを起動中: [ OK ]
カーネルロガーを起動中: [ OK ]


次に、PostgreSQLのプロセスを再起動します。


# /etc/init.d/postgresql restart
postgresql サービスを停止中: [ OK ]
postgresql サービスを開始中: [ OK ]



これで、PostgreSQLのログが/var/log/pgsqlファイルに出力されるようになります。

中身を見てみると


Oct 9 09:08:41 localhost postgres[14356]: [1-1] LOG: received fast shutdown request
Oct 9 09:08:41 localhost postgres[18241]: [2-1] LOG: shutting down
Oct 9 09:08:44 localhost postgres[18241]: [3-1] LOG: database system is shut down
Oct 9 09:08:44 localhost postgres[18280]: [1-1] LOG: database system was shut down at 2007-10-09 09:08:44 JST
Oct 9 09:08:44 localhost postgres[18280]: [2-1] LOG: checkpoint record is at 0/54450C4
Oct 9 09:08:44 localhost postgres[18280]: [3-1] LOG: redo record is at 0/54450C4; undo record is at 0/0; shutdown TRUE
Oct 9 09:08:44 localhost postgres[18280]: [4-1] LOG: next transaction ID: 212560; next OID: 109930
Oct 9 09:08:44 localhost postgres[18280]: [5-1] LOG: database system is ready



のようにPostgreSQLを再起動をしたログが出力されています。


4. logrotateの設定(オプション)


ここまでで既にログが出力されるようになっていますが、今度はそのログファイルが肥大化しないよう適当な周期で退避させるように、logrotateに設定しておきます。


ログは、syslogを経由して行われている為、logrotateにデフォルトで存在するsyslog関連の設定をまとめた設定ファイル(syslog)に、PostgreSQLのログファイルを追記します。


# vi /etc/logrotate.d/syslog


下記のように最後に、PostgreSQLのログファイル(/var/log/pgsql)の設定を追加します。


/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/pgsql {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}


logrotateが上手く動作しない場合は


logrotateでログファイルがローテーションされない事への対処


も併せて参照してみてください。