web-dev-qa-db-ja.com

PostgreSQLロギングの制限

適度に大きなBYTEA値を含むことができるテーブルがあります(同じことが大きなTEXT値にも当てはまります)。次のようになります。

CREATE TABLE testtable (
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE NOT NULL, -- This is just an example: this could be the PK
    value BYTEA -- This could be TEXT
);

このテーブルを使用するアプリケーションが同じnameを使用して2つの行を挿入しようとすると、ログに次のエラーが表示されます(もちろん、これは予想されるエラーです)。

ERROR:  duplicate key value violates unique constraint "testtable_name_key"
STATEMENT:  INSERT INTO testtable(name, value) VALUES ('a', ...something rather long...);

エラーをログに記録することは、ステートメント(およびこの特定のコンテキストでの「name」の値)をログに記録するのと同様に役立ちますが、長いBYTEAまたはTEXT値をログに記録することは役に立ちません。実際、ログ内のバイナリデータはテキスト形式(例:E'\\377\\327...')でエスケープされるため、データベース内のバイナリ形式よりもさらに多くのスペースが必要になります。これは、値のサイズが数十kB以上の場合、ヘルプよりも多くの問題を引き起こす可能性があります。

エラーが発生したときにこれらの値がログに表示されないようにする方法はありますか?私はまだエラーがあったことを知りたいと思っています(そしてできればステートメントに関する情報を持っていることが望ましいです)。もちろん、これはこの特定のエラーとユースケースだけでなく、ログに数キロバイトの関心のないデータをダンプする可能性のあるエラーログでもあります。

それ以外の場合、「STATEMENT: INSERT INTO ...」行を切り捨てる方法はありますか?それができない場合、ERROR:行を保持する以外に、STATEMENT:行を完全に削除する方法はありますか?

log_error_verbosity = tersepostgresql.confに設定しようとしましたが、何も変更されていないようです。

(私はlog_destination = 'syslog'を使用してrsyslogにログを記録しているので、各ログの「バンドル」を数行に制限するソリューションは妥当な妥協案です。)

私はPostgreSQL8.4を使用していますが、新しいバージョンにのみ存在するソリューションも興味深いでしょう。

5
Bruno

はい、ログでそれらのメッセージを非表示にすることができます。

呼び出しセッションで、INSERTステートメントを実行する前に、次のステートメントを発行します。

SET log_min_messages TO log; 

ERROR:部分を引き続き表示し、STATEMENT:部分のみを非表示にする場合は、別のパラメーターを使用します。

SET log_min_error_statement TO log; 

docs を参照してください。

セッションパラメータのみを使用してください。アプリケーションは、どのステートメントが無音になるかを知っている必要があります。技術的には、could設定を永続的にすることができます(postgresql.conf内)が、それは良い考えではありません。場合によっては、これはフットガンになります。

1
filiprem