結論
-L オプションを使えば良い(PostgreSQL 8.1 から追加)。
psql ... -L psql.log
-L filename--log-file=filenameすべての問い合わせの出力を通常の出力先に出力し、さらにファイルfilenameに書き出します。
以下のようなログが出力される。
/******** QUERY *********/ select count(*) from foo; /************************/ count ------- 218 (1 row) /******** QUERY *********/ select id, name from foo limit 5; /************************/ id | name -----+---------- 869 | ABB 881 | AAB 875 | ABC 891 | AAA 895 | AAB (5 rows)
\i メタコマンドでファイルから読み込んだSQLとその結果もファイル出力される。
ただし、エラーになったSQLは出力されるが、そのエラー内容などはファイル出力されない。
その他の方法
似たようなオプションに以下がある。
-o filename--output=filename全ての問い合わせの出力をfilenameファイルに書き込みます。 これは\oコマンドと同じ効力を持ちます。
これは、クエリ結果のみをファイル出力し、発行したSQLはログ出力されない。
\qecho でログに任意文字列を出力できるので、以下のようにすればSQLをログ出力することはできる、が あまりに面倒。
# \qecho select count(*) from foo; # select count(*) from foo;
Linux なら script で記録してしまうのが簡単。
$ script psql.log $ psql -h host -p port -d db -U user -a ... # \q $ <Ctrl + D>
script の終了は Ctrl + D。
PowerShell なら Start-Transcript Stop-Transcript になるのだが
> Start-Transcript -Path "./psql.log" > psql -h host -p port -d db -U user -a ... # \q > Stop-Transcript
しかし、Start-Transcript では psqlコマンド出力の最後のバッファ分しかログ出力されない。
ので、Start-Transcript Stop-Transcript は使えない。