PostgresSQLでログを取る

2006/05/29

セキュリティ関連の話で、「誰が、何時、どこから、どのようなデータ」を取得したかログを取りたいという要望があったので調査した内容です


前提条件: PostgreSQL8.x
ディストリビューションはRedHatですが、他のディストリビューションでも問題ないと思います

postgresql.confの変更

log_min_duration_statement = 0
log_connections = on
log_disconnections = on
log_duration = on
log_line_prefix = '%t: %p: '

※ PostgreSQL8.1以降なら log_line_prefix = '%t: %p: ' の %t を %m に変更するとミリ秒単位で時間の記録が出来ます(オプションの詳しい内容は、こちらをご覧下さい)

ログは、/var/lib/pgsql/data/pg_log ディレクトリに出力されます。
(postgresql-曜日.log というファイル名)

出力したログの例

2006-05-29 01:44:11 JST: 7140: LOG: connection received: host=[local] port=
2006-05-29 01:44:11 JST: 7140: LOG: connection authorized: user=postgres database=template1
2006-05-29 01:44:11 JST: 7092: LOG: checkpoints are occurring too frequently (16 seconds apart)
2006-05-29 01:44:11 JST: 7092: HINT: Consider increasing the configuration parameter "checkpoint_segments".
2006-05-29 01:44:11 JST: 7140: LOG: duration: 363.518 ms statement: CREATE DATABASE postgres;

2006-05-29 01:44:11 JST: 7140: LOG: disconnection: session time: 0:00:00.36 user=postgres database=template1 host=[local] port=
2006-05-29 01:44:18 JST: 7143: LOG: connection received: host=[local] port=
2006-05-29 01:44:18 JST: 7143: LOG: connection authorized: user=postgres database=postgres
2006-05-29 01:44:32 JST: 7143: LOG: duration: 21.925 ms statement: create table aaa ( abc int ) ;
2006-05-29 01:44:37 JST: 7143: LOG: duration: 13.356 ms statement: insert into aaa values( 1024 ) ;
2006-05-29 01:44:41 JST: 7143: LOG: duration: 1.154 ms statement: insert into aaa values( 1023 ) ;
2006-05-29 01:44:46 JST: 7143: LOG: duration: 0.428 ms statement: select * from aaa ;
2006-05-29 01:44:48 JST: 7143: LOG: disconnection: session time: 0:00:30.26 user=postgres database=postgres host=[local] port=

上記ログは、下記のコマンドを実行した場合に出力されたログです。
# su - postgres
$ createdb
$ psql
postgres=# create table aaa ( abc int ) ;
postgres=# insert into aaa values( 1024 ) ;
postgres=# insert into aaa values( 1023 ) ;
postgres=# select * from aaa ;
postgres=# \q
$

なお、ログの時間の隣に出ている番号がプロセス識別子なので、この番号で分類すれば接続別に分けることが出来ると思います

mail-icon kawaml@zato.nu (特定電子メールの受信を拒否する)