PostgreSQLクエリをログに記録する方法は?


373

PostgreSQL 8.3によって実行されたすべてのSQLのロギングを有効にする方法は?

編集(詳細) 私はこれらの行を変更しました:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

そして、PostgreSQLサービスを再起動します...しかし、ログは作成されませんでした...私はWindows Server 2003を使用しています。

何か案は?


15
これは重要です:logging_collector = on
bonyiii '

また、一部のGNU / Linuxディストリビューション(Debian Jessieなど)では、systemctl restart postgresql構成したPostgreSQLサービスが実際に再起動されない場合があります(理由はまだわかりません)。そのため、構成ファイルの変更は適用されません。pg_ctl(またはpg_ctlclusterDebian)を使用する方が安全です。
Skippy le Grand Gourou

4
私はただのPostgreSQL 9.5で、Ubuntuの16.04 LTSでこれをテストし、そしてsystemctl reload postgresqlsystemctl restart postgresqlservice postgresql reloadおよびservice postgresql restartすべての設定を有効に変更レンダリング。
ベンジョンソン

回答:


466

あなたにはdata/postgresql.conf、ファイル、変更log_statementに設定を'all'


編集する

あなたの新しい情報を見て、確認すべき他の設定がいくつかあるかもしれません:

  • log_destination変数をオンにしていることを確認してください
  • 必ずオンにしてください logging_collector
  • また、log_directoryディレクトリがディレクトリ内にすでに存在dataし、postgresユーザーがそのディレクトリに書き込みできることを確認してください。

3
気になるのは、サーバーを再起動しないとPostgreSQLがロギングを有効にできないということですか?MySQLでは、「SET GLOBAL general_log = 'ON';」のように単純です。
アントニー

7
MySQLのようなSQLステートメントを使用してそれを行う方法があるかどうか私自身はわかりませんが、実行中のサーバーに構成を再ロードするコマンドを送信できますpg_ctl reload
Jarret Hardie

9
PostgreSQLには、SQLステートメントを介してパラメーターを変更する方法がまだありません(9.2以降)。ほとんどのロギングパラメータは、代わりにpg_ctl reloadを実行するだけで、サーバーを完全に再起動することなく変更できます。ただし、logging_collectorを変更するには再起動が必要です。
グレッグ・スミス

6
Postgres 9.4と新しいALTER SYSTEMコマンドを使用すると、スーパーユーザーはSQLからGUCパラメータを設定できます。
Erwin Brandstetter 2015年

6
data答えに引用されたディレクトリは、その文字通りの名前ではありません。data_directoryPostgreSQL構成ファイルで変数に割り当てられたパスを参照します。DebianおよびUbuntu GNU / Linuxでは、このファイルは通常にあります/etc/postgresql/$v/main/postgresql.conf$vサーバのバージョンです。また、前述のシステムでlog_destination = 'stderr'は、出力がに書き込まれます/var/log/postgresql/postgresql-$v-main.log。ここ$vで、はサーバーのバージョンです(内部の場所ではありませんdata_directory)。
ベンジョンソン

104

を編集し、/etc/postgresql/9.3/main/postgresql.conf次のように行を変更します。

postgresql.confファイルが見つからなかった場合$locate postgresql.confは、ターミナルに入力してください

  1. #log_directory = 'pg_log' log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' log_statement = 'all'

  4. #logging_collector = off logging_collector = on

  5. オプションSELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart または sudo service postgresql restart

  7. postgresqlでクエリを起動する select 2+2

  8. 現在のログインを見つける /var/lib/pgsql/9.2/data/pg_log/

ログファイルは時間とともに大きくなる傾向があり、マシンを殺す可能性があります。安全のために、ログを削除してpostgresqlサーバーを再起動するbashスクリプトを記述してください。

ありがとう@paul、@Jarret Hardie、@Zoltán、@Rix Beck、@Latif Premani


2
debianストレッチでは、# log_destination = 'stderr'これが機能する前に、構成ファイルのコメントを外す必要もありました。
phihag

私はあなたの手順を注意深くフォローしましたが、うまくいきません。再起動する必要がありますか?
Yohanes AI 2018

2
bashスクリプトを作成したくないが、ログを毎月上書きするだけlog_filename = 'postgresql-%d.log'の場合は、次のようにします。再起動するたびに上書きされない場合、毎日追加され、毎月上書きされます。もちろん、28、29、30、31か月に応じて異なる日があります-しかし、あなたはアイデアを得ます。
sojim2

44
SELECT set_config('log_statement', 'all', true);

接続後、対応するユーザー権利で上記のクエリを使用できます。これは、セッションが終了するまでロギングに影響します。


7
SET log_statement = 'all'または(トランザクションレベルの場合)を使用する方が一般的にクリーンSET LOCAL log_statement = 'all'です。client_min_messageslog_min_messages設定にも興味があるかもしれません。
クレイグリンガー

1
接続のメッセージだけをログに記録したいので、これは素晴らしいことです。残念ながらpermission denied to set parameter "log_statement"、私のユーザーはスーパーユーザーではありません。
guettli 2014年

3
関数を実行する権限をDB管理者に要求することができます。GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Rix Beck

35

また、PostgreSQLに次の行を追加してサーバーを再起動する必要があります。

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
logging_collector = onが必要
wjin

魅力のように機能します。Required to be on for csvlogsこのオプションはクエリの出力をログに記録するためのもので、ステートメントだけをログに記録するためのものではない、と言った設定ファイルのコメントに戸惑いましたが、そうではありません。
Jacopofar

data / postgresql.confファイルで、log_statement設定を「all」に変更します。
FlyingV

32

参考:他のソリューションでは、デフォルトデータベースのステートメントのみがログに記録されますpostgres。彼らのソリューションから始めます。次に:

ALTER DATABASE your_database_name
SET log_statement = 'all';

参照:https : //serverfault.com/a/376888 /log_statement



20

上記の回答に+1します。私は次の設定を使用します

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

10

このWebページにある指示に基づいて、PostgreSQL 9.2を実行しているCentOS 6.4(Red Hat 4.4.7-3)の詳細を確認するだけです

  1. (コメント解除)log_statement = 'all'およびlog_min_error_statement = errorで設定し/var/lib/pgsql/9.2/data/postgresql.confます。
  2. PostgreSQL設定をリロードします。私にとって、これはを実行することで行われました/usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/
  3. 今日のログインを見つける /var/lib/pgsql/9.2/data/pg_log/

4
あなたがする必要はありません再起動 - pg_ctl reload十分ではなく、割り込みの接続を行います。この答えはすでにここにあるものに何かを追加すると確信していません。
クレイグリンガー

1
@CraigRingerコメントをありがとう、それは非常に重要な事実です。私があなたの提案を試したら、答えを更新します。この回答は主に参考のために書きました。これは、当時、UNIXの経験がほとんどなく、必要なすべての情報を1か所に収めたいと考えていたためです(たとえば、postgresql.confの場所とログファイル)。
ゾルタン2013

0

また、このパラメーターを設定して、すべてのステートメントをログに記録する必要があります。

log_min_duration_statement = 0

0

私は設定しようとしていました log_statementいくつかのpostgres設定ファイルにが、実際にはそのファイルはpostgresによって読み取られませんでした。

私はリクエストを使用してそれを確認しました:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

私はこのように使用しますhttps://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.