2015年1月29日木曜日

PostgreSQL/PostgreSQLでSQLステートメントをログファイルに出力する方法

デバッグなどでアプリケーションソースコードを修正せずに操作により発行されるSQLステートメントを
確認したいと思った場合、以下に記述したようにpostgresql.confファイルを設定し再起動すればログにSQLステートメントが出力されます。
このような使い方の場面はデバッグなどで使用すると思います。
以下に設定方法を記します。
以下の手順でログにSQLステートメントを出力するようにPostgreSQLを設定します。

postgresql.confのありかを調べる
postgresql.confファイルを修正するのでpostgresql.confファイルを開きます。
もし、postgresql.confファイルのありかがわからない時や忘れてしまった場合などは、psコマンドとgrepで探せば簡単に見つかると思います。
psコマンドとgrepで検索した結果は以下の通りです。 使用したコマンド
ps auxw | grep postgres
上記では、postgresで検索しました。postmasterでした方がいい場合もあります。
また、postgresユーザ以外または、postmasterコマンド以外でPostgreSQLを起動している場合はgrepの引数であるpostgresを環境に適した文字列にし実行してください。

実行例
以下の実行結果を見ると -D /var/lib/pgsql/data と表示されているのが確認できます。
postgresql.confは/var/lib/pgsql/dataにあることが推測できます。
[sakura@centos6 ~]$ ps auxw | grep postgres | grep -v grep
postgres 2083 0.0 0.6 214100 6384 ? S 00:19 0:00 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
postgres 2112 0.0 0.1 177112 1408 ? Ss 00:19 0:00 postgres: logger process
postgres 2114 0.0 0.1 214100 1840 ? Ss 00:19 0:00 postgres: writer process
<snip>

ログ出力のためにlogging_collectorの設定を行う postgresql.confを開き、logging_collectorをonにします。
# This is used when logging to stderr:
logging_collector = on # Enable capturing of stderr and csvlog
# into log files. Required to be on for
# csvlogs.
# (change requires restart)

ちなみにログ出力されるディレクトリ名は、postgresql.conf内のlog_directoryの値になります。
# These are only used if logging_collector is on:
log_directory = 'pg_log' # directory where log files are written,
# can be absolute or relative to PGDATA

SQLステートメントをログファイルに出力するためにlog_statementを設定する
postgresql.conf内になるlog_statementの設定を以下のいづれかに変更します。
none 出力しない
ddl CREATE、ALTER、およびDROPといった、データ定義コマンドをログに出力します。
mod ddlとINSERT、UPDATE、DELETE、TRUNCATE、およびCOPY FROMをログに出力します。
PREPAREとEXPLAIN ANALYZEコマンドも、そこに含まれるコマンドが適切な種類であればログに出力されます。
all すべてのSQLがログに出力されます。
参考資料 : PostgreSQL 8.4.4文書 18.7. エラー報告とログ取得

本資料ではallを指定しました。
log_statement = 'all' # none, ddl, mod, all

ちなみにpostgresql.confの先頭にある#はコメントを意味します。
修正しても#を削除しないとデフォルト値が使用されるので注意してください。

PostgreSQLを再起動します。
本資料ではCentOS6のRPMパッケージによりPostgreSQLをインストールしてあるので、serviceコマンドを使用しました。
pg_ctl restart オプションでも再起動できますので、みなさんの環境にあった方法でPostgreSQLを再起動してください。
[root@centos6 ~]# service postgresql restart
postgresql サービスを停止中: [ OK ]
postgresql サービスを開始中: [ OK ]
設定した値が変更されているかpsqlコマンドで確認してみました。
-bash-4.1$ psql -c 'show log_statement'
log_statement
---------------
all
(1 行)

実際に端末からSQLを発行した時のログ出力 †
以下に端末からPostgreSQLを操作しtailコマンドでPostgreSQLのログ出力を確認した結果を記します。

端末からPostgreSQLを操作
-bash-4.1$ echo $USER
postgres
-bash-4.1$ createdb sakura
-bash-4.1$ psql sakura
psql (8.4.13)
"help" でヘルプを表示します.

sakura=# create table t1 (c1 int, c2 int);
CREATE TABLE
sakura=# insert into t1 values(1,10);
INSERT 0 1
sakura=# select * from t1;
c1 | c2
----+----
1 | 10
(1 行)

sakura=# \q
PostgreSQLのログをtailコマンドで確認
-bash-4.1$ tail -f $PGDATA/pg_log/postgresql-Mon.log
<snip>
LOG: 文: CREATE DATABASE sakura;

LOG: 文: create table t1 (c1 int, c2 int);
LOG: 文: insert into t1 values(1,10);
LOG: 文: select * from t1;
以上、PostgreSQLでSQLステートメントをログファイルに出力する方法を記しました。

0 件のコメント:

コメントを投稿