このエントリーをはてなブックマークに追加


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を設定します。

  1. 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>
       
  2. ログ出力のために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
     
  3. SQLステートメントをログファイルに出力するためにlog_statementを設定する
    postgresql.conf内になるlog_statementの設定を以下のいづれかに変更します。
    none出力しない
    ddlCREATE、ALTER、およびDROPといった、データ定義コマンドをログに出力します。
    modddlと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の先頭にある#はコメントを意味します。
      修正しても#を削除しないとデフォルト値が使用されるので注意してください。
       
  4. PostgreSQLを再起動します。
    本資料ではCentOS6のRPMパッケージによりPostgreSQLをインストールしてあるので、serviceコマンドを使用しました。
    pg_ctl restart オプションでも再起動できますので、みなさんの環境にあった方法でPostgreSQLを再起動してください。
    [root@centos6 ~]# service postgresql restart
    postgresql サービスを停止中:                               [  OK  ]
    postgresql サービスを開始中:                               [  OK  ]
  5. 設定した値が変更されているか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ステートメントをログファイルに出力する方法を記しました。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:08:00