Categories: PostgreSQL

Postgres15 発行されたSQLをログで確認したい~Postgresログの種類~

postgresql.conf

#log_statement = 'none'                 # none, ddl, mod, all

none 記録なし
ddl CREATE、ALTER、DROPなど、データ定義文を全て記録
mod 全ddl文および、INSERT、UPDATE、DELETE、TRUNCATE、に加えCOPY FROMといった、データ変更文を記録
all 全SQL文を記録

自分の環境では mod を選択してあります。更新など変更が加わった時にログを残す感じです。さすがにselect 分まで残してしまうとログが膨大になるので、バランス見てmodにしてあります。

log_min_error_statement = ERROR

log_min_error_statementの表示レベルは以下の通り

DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, and PANIC

エラーを起こすとどうなる?

all設定で、SQL構文に間違いがあるとどうなるか確認してみた

log_statement = 'all'
log_min_error_statement = error

発行したSQL select * from test

test テーブルは存在しない場合

[2023-11-27 13:12:24 JST]172.21.100.25 jp 972[6]LOG:  文: select * from test
[2023-11-27 13:12:24 JST]172.21.100.25 jp 972[7]ERROR:  リレーション"test"は存在しません(15文字目)
[2023-11-27 13:12:24 JST]172.21.100.25 jp 972[8]文:  select * from test

ログの種類

ログを記録するレベル

log_min_messages
log_min_error_statement

ログに記録する内容

さまざまなデバッグ出力を出力できる。結果の解析ツリー、クエリ リライターの出力、または実行された各クエリの実行プランが出力。

debug_print_parse
debug_print_rewritten
debug_print_plan

サーバーへの接続試行と、クライアント認証の正常な完了がログに記録

log_connections

セッションの終了がログに記録

log_disconnections

どの SQL ステートメントをログに記録するかを制御

log_statement

perform

PostgreSQL の PERFORM 文は、ストアドファンクション内でファンクションを呼び出すために使用します。PERFORM 文は、返り値が void のファンクションを呼び出すために使用します。

Pl/PgSQLを実行しても実行されたSQLはログに残らない

ストアドプロシージャ内に配置したSQL文は、postgresql.conf設定

log_statement = 'all'

設定にしていても、ログには残らない。

ストアドプロシージャが実行されたログだけは残るけど。

select total.fx_stored();

を実行した時のログ

[2023-11-29 12:02:01 JST][local] jp 13897[1]LOG:  文: select total.fx_stored();

エラー起こしてみる

ストアドプロシージャの中に、エラーを吐くSQLを追加してみる

SELECT aa FROM test.com

そもそも、test.com というテーブルなど存在しない場合

[2023-11-29 14:23:12 JST]jp 14525[13]ERROR:  リレーション"test.com"は存在しません(16文字目)
[2023-11-29 14:23:12 JST]jp 14525[14]問い合わせ:  SELECT aa FROM test.com
[2023-11-29 14:23:12 JST]jp 14525[15]文脈:  PL/pgSQL関数total.fx_stored()の73行目 - SQL ステートメント

ストアドプロシージャ内にSQLを書いていても、そのSQLが実行されたかどうかの記録はログに残らない。ただし、ストアドプロシージャ内にエラーがある場合は、エラー内容がログに残る。

hanako