PostgreSQLでSQLステートメントをログファイルに出力する方法 †
デバッグなどでアプリケーションソースコードを修正せずに操作により発行されるSQLステートメントを
確認したいと思った場合、以下に記述したようにpostgresql.confファイルを設定し再起動すればログにSQLステートメントが出力されます。
このような使い方の場面はデバッグなどで使用すると思います。
以下に設定方法を記します。
本資料で使用した環境 †
- OS
CentOS6(X86_64)
- PostgreSQL(CentOSのRPMパッケージを使用)
PostgreSQL 8.4.13 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit
関連資料 †
linux.just4fun.bizの記事
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を環境に適した文字列にし実行してください。
- ログ出力のために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を再起動します。
本資料では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ステートメントをログファイルに出力する方法を記しました。