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

#contents
#htmlinsertpcsp(db-top.html,db-sp.html)

* 本資料で使用した環境 [#za69c29d]
- OS~
CentOS6(X86_64)
#br
- 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

* 関連資料 [#b216c906]
[[linux.just4fun.biz>http://linux.just4fun.biz/]]の記事
-[[psコマンドでプロセスの引数を確認する方法>http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/ps%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E5%BC%95%E6%95%B0%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html]]

-[[PostgreSQLが出力するログの言語を英語にする方法>PostgreSQL/ログの言語を英語にする方法]]

* postgresql.confの修正しSQLステートメントをログファイルに出力する [#te629ffa]
以下の手順でログに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を環境に適した文字列にし実行してください。
#br
-- 実行例~
以下の実行結果を見ると -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>
#br
+ ログ出力のために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)
#br
ちなみにログ出力されるディレクトリ名は、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
#br
+ SQLステートメントをログファイルに出力するためにlog_statementを設定する~
postgresql.conf内になるlog_statementの設定を以下のいづれかに変更します。
|none|出力しない|
|ddl|CREATE、ALTER、およびDROPといった、データ定義コマンドをログに出力します。|
|mod|ddlとINSERT、UPDATE、DELETE、TRUNCATE、およびCOPY FROMをログに出力します。&br;PREPAREとEXPLAIN ANALYZEコマンドも、そこに含まれるコマンドが適切な種類であればログに出力されます。|
|all|すべてのSQLがログに出力されます。|
-- 参考資料 : [[PostgreSQL 8.4.4文書 18.7. エラー報告とログ取得>http://www.postgresql.jp/document/8.4/html/runtime-config-logging.html]]
#br
本資料ではallを指定しました。
 log_statement = 'all'                 # none, ddl, mod, all
#br
ちなみにpostgresql.confの先頭にある#はコメントを意味します。~
修正しても#を削除しないとデフォルト値が使用されるので注意してください。
#br
+ 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を発行した時のログ出力 [#sbc45c63]
以下に端末から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ステートメントをログファイルに出力する方法を記しました。

#htmlinsertpcsp(db-btm.html,db-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS