ログ
セキュリティやインテグリティでログが必要になることを記載してきましたが、PostgreSQLで管理できるログについて記載します。
一般的にデータベースのログには、操作やイベントに関する情報を記録してシステムの可用性、耐障害性、セキュリティ、復旧などの重要な役割を持っています。
データベースのログは、主にトランザクションログ、クエリログ、レプリケーションログ、エラーログ、セキュリティログなどがあります。
トランザクションログ
PostgreSQLのトランザクションログはpg_xlogディレクトリに格納されます。
これは物理的なレベルでのトランザクションログで、データの変更をトランザクションごとにログとして記録します。
障害が発生した場合、データベースの復旧で使用します。
エラーログ
PostgreSQLのエラーログはデフォルトでは pg_log ディレクトリに格納されます。
エラーログにはデータベースの起動や停止に関する情報、エラーメッセージ、警告メッセージなどがあります。
logging_collectorやlog_statement などで設定できます。
クエリログ
PostgreSQLのクエリログ(またはログステートメント)を記録します。
クエリログは、実行されたSQLクエリやそれに対する実行計画などが含まれます。
スロークエリの調査などで利用できます。
log_statement および log_duration などで設定できます。
ステートメントログ
PostgreSQLのステートメントログは、pg_stat_statementsモジュールを使用して、実行されたSQLステートメントの統計情報を取得できます。
クエリの実行回数、実行にかかった時間、ディスクアクセス回数などを確認できます。
バックアップログ
PostgreSQLのバックアップログは、pg_basebackupコマンドによって行われるバックアップに関するログです。
バックアップログは、データベースの動作のトラブルシューティング、パフォーマンスの最適化、セキュリティの監査などに使用されます。
PostgreSQLのログの詳細度や保存場所は、postgresql.conf ファイル内の設定や、対話型コンソールでの設定などを通じて構成できます。
PostgreSQLのログ
PostgreSQLには監査ログと正式に呼べそうなものはありません。
しかし、設定によっては同等のことを行うことも可能です。
設定は前述しているpostgres.confで行いますが、ここでは詳細を記載いたします。
ログの書込有無の設定として、log_statementがありますが、設定値を次に記載いたします。
[設定値]
none
→ログを記録しない
ddl
→CREATE、ALTERなどddlのクエリログを記録
mod
→ddl文に加え、INSERT、UPDATE、DELETE、TRUNCATE、COPYなど更新系のクエリログを記録
all
→全てのクエリログに記録
※PREPAREとEXPLAIN
ANALYZEコマンドも、適切な種類であればログに残ります。
エラーログの書き込み方法として、log_destinationがあります。
csvやsyslogなど特に指定がなければ、標準エラー出力であるstderrで問題ないと思います。
何をログとするかの設定として、log_line_prefixがあり、設定値を次に記載いたします。
%a アプリケーション名
%u ユーザ名
%d データベース名
%r 遠隔ホスト名、またはIPアドレス、およびポート番号
%h 遠隔ホスト名、またはIPアドレス
%p プロセス識別子
%t ミリ秒無しのタイムスタンプ
%m ミリ秒付きタイムスタンプ
%i コマンドタグ
%e SQLSTATE エラーコード
%c セッションID
%l 各セッションまたは各プロセスのログ行の番号
%s プロセスの開始タイムスタンプ
%v 仮想トランザクションID(backendID/localXID)
%x トランザクションID (未割り当ての場合は0)
%q 出力停止
%% %文字そのもの
接続と切断のログを取りたい場合は、postgres.confに次を記載することで取得できます。
log_connections = on
log_disconnections = on
PostgresSQL内容 syslog
DEBUG 開発者用ログ DEBUG
INFO ユーザによって暗黙的に要求されたログ INFO
NOTICE ユーザ補助向けログ NOTICE
WARNING 警告ログ NOTICE
ERROR コマンド断したたエラーログ WARNING ERROR
LOG 管理者用ログ INFO
FATAL エラーログ ERR
PANIC クリティカルエラーログ CRIT
log_min_error_statementでは、指定レベルのエラーが発生したときにクエリもログ出力します。
テーブルの値に変更が発生した場合、ログ出力を行いたい場合はトリガプロシージャを利用すれば対応可能です。
関数の呼出数と使用した時間のを確認するには、postgres.confでtrack_functionsパラメータで設定します。
利用しないなら、noneで、手続き言語だけならplにし、c言語などを利用する場合はallを設定します。
現在実行されているコマンドに関する情報を取得したい場合、postgres.confでtrack_activitiesを有効にします。
また、データベースクラスタ内のログファイルもどのようなものがあるか把握が必要です。
詳細を次に記載いたします。
[pg_clog]
トランザクションがコミットしたかロールバックしたかを管理するログ
[pgstartup.log]
postgresql起動時ログ
FATAL: 秘密キーファイル"server.key"をロードできませんでした:
許可がありません
[pg_log]
基本的なログ(稼働時・スロークエリなど)
[pg_multixact]
マルチトランザクション状態のデータを保有するサブディレクトリ(共有行ロックで使用されます)
[pg_notify]
LISTEN/NOTIFY状態データを保有するサブディレクトリ
通知を送信するために関数pg_notify(text,text)を使用することもできます。
この関数は第1引数としてチャネル名、第2引数としてペイロードを取ります。
不定のチャネル名、ペイロードで作業しなければならない場合は、NOTIFYコマンドよりこの関数を使用する方がかなり簡単です。
[pg_serial]
コミットされたシリアライザブルトランザクションに関する情報を保有するサブディレクトリ
[pg_snapshots]
エキスポートされたスナップショットを保有するサブディレクトリ
select
pg_export_snapshot();でスナップショットを作成した場合にファイルが発生
[pg_stat]
統計情報の永続ファイルを保有するサブディレクトリ
[pg_stat_tmp]
統計情報の一時ファイルを保有するサブディレクトリ
[pg_subtrans]
サブトランザクションの状態のデータを保有するサブディレクトリ
[pg_tblspc]
テーブル空間へのシンボリックリンクを保有するサブディレクトリ
[pg_twophase]
プリペアドトランザクション用の状態ファイルを保有するサブディレクトリ