無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

18.8. エラー報告とログ取得

18.8.1. ログの出力先

log_destination ( string )

PostgreSQL は、 stderr csvlog および syslog を含めて、サーバメッセージのログ取得に対し数種類の方法を提供します。 Windowsでは、 eventlog も同時に提供します。 このパラメータを設定するには、コンマ区切りでお好みのログ出力先を記載します。 デフォルトでは、ログは stderr のみに出力されます。 このパラメータは postgresql.conf ファイル、または、サーバのコマンドラインでのみ設定されます。

csvlog log_destination に含まれる場合、ログ項目はプログラムへの読み込みが簡便な "カンマ区切り値" 書式( CSV )で出力されます。 詳細は 項18.8.4 を参照してください。 CSV書式のログ出力を生成するためには logging_collector を有効にする必要があります。

注意: log_destination syslog オプションを使用できるようにするために、ほとんどのUnixシステムではシステムの syslog デーモンの設定を変更しなければならないでしょう。 PostgreSQL ではログを LOCAL0 から LOCAL7 までの syslog ファシリティで記録することができます( syslog_facility を参照してください)。 しかし、ほとんどのプラットフォームのデフォルトの syslog 設定ではこれらのメッセージはすべて破棄されます。 うまく動作させるために syslog デーモンの設定に以下のようなものを追加しなければならないでしょう。

local0.*    /var/log/postgresql

Windowsで log_destination に対し eventlog オプションを使用する場合、Windows Event Viewer がイベントログメッセージを手際良く表示できるよう、オペレーティングシステムでイベントソースとそのライブラリを登録しなければなりません。 詳細は 項17.11 を参照ください。

logging_collector ( boolean )

このパラメータは logging collector を有効にします。 その形成要素は stderr に送られたログメッセージを補足し、ログファイルにリダイレクトするバックグランドプロセスです。 この手法は syslog へのログよりもしばしば有用です。 メッセージの一部の種類が syslog では出力されない可能性があるためです。 (一般的な例として、ダイナミックリンカのエラーメッセージがあり、その他の例として archive_command のようなスクリプトにより生成されたエラーメッセージが挙げられます)。 このパラメータはサーバ起動時のみ設定可能です。

注意: ログ収集機構を使用せずに stderr のログを取ることは可能です。 ログメッセージはサーバの stderr が指し示すいかなる場所にも向かうだけです。 しかし、その方法はログファイルを巡回させる都合のよい方法を提供しないので、ログ容量が小さい場合のみに適しています。 同時に、ログ収集機構を使用しないいくつかのプラットフォームにおいては、ログ出力が失われたり、文字化けします。なぜなら、同一のログファイルに同時に書き込みを行うマルチプロセッサはそれぞれの出力を上書きできるからです。

注意: ログ取得機構はメッセージを決して失わないために設計されています。 これは、極端に高い負荷の場合、サーバプロセスはコレクタが遅れをとった場合、追加のログメッセージを送信しようと試みる時に阻止される可能性があります。 それとは対象的に syslog は、もし書き込みができなかったときメッセージの廃棄方を選びます。 これらの場合にはいくつかのログメッセージを失うことになりますが、残ったシステムを阻止しません。

log_directory ( string )

logging_collector を有効と設定した場合、このパラメータはログファイルが作成されるディレクトリを確定します。 ディレクトリは、絶対パス、もしくはデータベースクラスタのディレクトリに対する相対パスで指定することができます。 このパラメータは postgresql.conf ファイル、またはサーバコマンドラインからのみ設定可能です。

log_filename ( string )

logging_collector が有効な場合、このパラメータは作成されたログファイルのファイル名を設定します。 値は strftime パターンとして扱われるため、 % エスケープを使用して、時刻によって変動するファイル名を指定することができます。 (時間帯に依存した % エスケープが存在する場合、 log_timezone で指定された時間帯で計算が行われます。) サポートされている % -エスケープは strftime 仕様によく似ています。 システムの strftime は直接使用されないので、プラットフォーム固有の(非標準)の拡張は動作しません。

エスケープすることなくファイル名を指定する場合、ディスク全体を使い切ってしまうことを防止するためにログローテーションを行うユーティリティを使用することを計画しなければなりません。 8.4より前のリリースの PostgreSQL では、 % エスケープがなければ、新しいログファイルの生成時のエポック時刻を付与しますが、これはもはや当てはまりません。

CSV書式の出力が log_destination で有効な場合、タイムスタンプ付きのログファイル名にに .csv を付与し、最終的なCSV書式出力用のファイル名が作成されます。 (log_filenameが .log で終わる場合は後置詞が置き換えられます。) 上の例の場合、ファイル名は server_log.1093827753.csv となります。

このパラメータは postgresql.conf か、サーバコマンドラインのみ設定可能です。

log_file_mode ( integer )

Unixシステムにおいては、 logging_collector が有効になっている場合、このパラメータはログファイルのパーミッションを設定します。 (Microsoft Windowsではこのパラメータは無視されます。) パラメータの値は chmod および umask システムコールで許容されるフォーマットで指定される数値モードであると期待されます。 (慣例的な8進数フォーマットを使用する場合、番号は 0 (ゼロ)で始まらなければなりません。

デフォルトのパーミッションは 0600 で、意味するところはサーバの所有者のみログファイルの読み書きが可能です。 そのほか一般的に実用的な設定は 0640 で、所有者のグループはファイルを読み込めます。 しかし、これらの設定を活用するには log_directory がクラスタデータディレクトリの外部のどこかにあるファイルを格納できるように変更する必要があります。

このパラメータは postgresql.conf ファイル、またはサーバコマンドラインからのみ設定可能です。

log_rotation_age ( integer )

logging_collector が有効な場合、このパラメータは個々のログファイルの最大寿命をを決定します。 ここで指定した時間(分単位)経過すると、新しいログファイルが生成されます。 ゼロに設定することで、時間に基づいた新しいログファイルの生成は無効になります。 このパラメータは、 postgresql.conf ファイル、または、サーバのコマンドラインでのみで設定されます。

log_rotation_size ( integer )

logging_collector が有効な場合、このパラメータは個々のログファイルの最大容量を決定します。 ここで指定したキロバイト分ログファイルに出力された後、新しいログファイルが生成されます。 ゼロに設定することで、サイズに基づいた新しいログファイルの生成は無効になります。 このパラメータは postgresql.conf ファイル、または、サーバのコマンドラインでのみで設定されます。

log_truncate_on_rotation ( boolean )

logging_collector が有効な場合、このパラメータにより、 PostgreSQL は既存の同名のファイルに追加するのではなく、そのファイルを切り詰める(上書きする)ようになります。 しかし、切り詰めは時間を基にしたローテーションのために新規にファイルが開かれた時にのみ発生し、サーバ起動時やサイズを基にしたローテーションでは発生しません。 偽の場合、全ての場合において既存のファイルは追記されます。 例えば、この設定を postgresql-%H.log のような log_filename と組み合わせて使用すると、24個の時別のログファイルが生成され、それらは周期的に上書きされることになります。 このパラメータは postgresql.conf ファイル、または、サーバのコマンドラインで設定されます。

例:7日間のログを保存し、毎日のログを server_log.Mon server_log.Tue 、等とし、そして自動的に前週のログを今週のログで上書きするには以下のように設定します。 log_filename server_log.%a とし、 log_truncate_on_rotation on にし、そして log_rotation_age 1440 に設定します。

例:24時間のログを保持、1時間おきに1つのログファイルを作成、ただし、ログファイルのサイズが1ギガバイトを超えそうな場合即座に切り替えさせるには、 log_filename server_log.%H%M にし、 log_truncate_on_rotation on にし、 log_rotation_age 60 にし、そして log_rotation_size 1000000 に設定します。 log_filename %M を含めると、元の時間毎のファイル名と異なる名前を選択する可能性がある、サイズを元にしたローテーションを行うことができます。

syslog_facility ( enum )

syslog へのログ取得が有効な場合、このパラメータは syslog "facility" が使われるように確定します。 LOCAL0 LOCAL1 LOCAL2 LOCAL3 LOCAL4 LOCAL5 LOCAL6 LOCAL7 の中から選んでください。 デフォルトは LOCAL0 です。 使用しているシステムの syslog デーモンの文書を同時に参照してください。 このパラメータは postgresql.conf ファイル、または、サーバのコマンドラインでのみで設定されます。

syslog_ident ( string )

syslog にログ取得が有効な場合、このパラメータは syslog ログ内の PostgreSQL メッセージを特定するのに使用するプログラム名を確定します。デフォルトは postgres です。 このパラメータは、 postgresql.conf ファイル、または、サーバのコマンドラインでのみで設定されます。

event_source ( string )

event log へのログ取得が有効になっていると、このパラメータはログ中の PostgreSQL メッセージを特定するのに使用されるプログラム名を決定します。デフォルトは PostgreSQL です。このパラメータは、 postgresql.conf ファイル、または、サーバのコマンドラインでのみで設定されます。

18.8.2. いつログを取得するか

client_min_messages ( enum )

どのメッセージ階層をクライアントに送るかを管理します。有効な値は、 DEBUG5 DEBUG4 DEBUG3 DEBUG2 DEBUG1 LOG NOTICE WARNING ERROR FATAL 、および PANIC です。それぞれの階層はそれに続く全ての階層を包含します。階層が後の方になるにつれ、より少ないメッセージが送られます。デフォルトは NOTICE です。ここでの LOG の優先順位が log_min_messages の場合と異なることに注意してください。

log_min_messages ( enum )

どのメッセージ階層をサーバログに書き込むかを管理します。有効な値は DEBUG5 DEBUG4 DEBUG3 DEBUG2 DEBUG1 INFO NOTICE WARNING ERROR LOG FATAL 、および PANIC です。それぞれの階層はその下の全ての階層を含みます。階層を低くする程、より少ないメッセージがログに送られます。デフォルトは WARNING です。ここでの LOG の優先順位が client_min_messages の場合と異なることに注意してください。スーパユーザのみこの設定を変更できます。

log_min_error_statement ( enum )

エラー条件の原因となったどのSQL文をサーバログに記録するかを制御します。 設定したレベル以上のメッセージについては現在のSQL文がログに記録されます。 有効な値は、 DEBUG5 DEBUG4 DEBUG3 DEBUG2 DEBUG1 INFO NOTICE WARNING ERROR LOG FATAL PANIC です。 デフォルトは ERROR です。 エラー、ログメッセージ、致命的エラー、パニックを引き起こした文がログに記録されることを意味します。 失敗した文の記録を実質的に無効にするには、このパラメータを PANIC に設定してください。 スーパーユーザのみがこのオプションを変更することができます。

log_min_duration_statement ( integer )

文の実行に少なくとも指定したミリ秒数かかった場合、それぞれの文の実行に要した時間をログに記録します。 0に設定すれば、すべての文の実行時間が出力されます。 -1(デフォルト)は、文実行時間の記録を無効にします。 例えば、 250ms と設定した場合、250msもしくはそれ以上長くかかった全てのSQL文がログとして残ります。 このパラメータを有効にすることにより、アプリケーションで最適化されていない問い合わせを追跡するのが便利になります。 スーパーユーザのみこの設定を変更できます。

拡張問い合わせプロトコルを使用するクライアントでは、Parse、Bind、Executeそれぞれの段階で要した時間が独立して記録されます。

注意: このオプションと log_statement を一緒に使用する時、 log_statement によってログされるテキスト文は、実行時間のログには重複されません。 syslog を使用していなければ、プロセスIDとセッションIDを使用して、文メッセージと後の実行時間メッセージを関連付けできるように、 log_line_prefix を使用してPIDまたはセッションIDをログに記録することを勧めます。

表18-1 で、 PostgreSQL で使用されるメッセージ深刻度レベルを説明します。 ログ出力が syslog またはWindowsの eventlog に送られる場合、この深刻度レベルは表で示すように変換されます。

表 18-1. メッセージ深刻度レベル

深刻度 使用方法 syslog eventlog
DEBUG1..DEBUG5 開発者が使用する連続的かつより詳細な情報を提供します。 DEBUG INFORMATION
INFO VACUUM VERBOSE の出力などの、 ユーザによって暗黙的に要求された情報を提供します。 INFO INFORMATION
NOTICE 長い識別子の切り詰めに関する注意など、 ユーザの補助になる情報を提供します。 NOTICE INFORMATION
WARNING トランザクションブロック外での COMMIT の様な、 ユーザへの警告を提供します。 NOTICE WARNING
ERROR 現在のコマンドを中断させる原因となったエラーを報告します。 WARNING ERROR
LOG チェックポイントの活動の様な、 管理者に関心のある情報を報告します。 INFO INFORMATION
FATAL 現在のセッションを中断させる原因となったエラーを報告します。 ERR ERROR
PANIC 全てのデータベースセッションを中断させる原因となったエラーを報告します。 CRIT ERROR

18.8.3. 何をログに

application_name ( string )

application_name NAMEDATALEN (標準構築では64)文字以下の任意の文字列を指定できます。 通常はサーバへの接続時にアプリケーションによって設定されます。 この名前は pg_stat_activity ビューに表示され、CSVログに含まれます。 また log_line_prefix パラメータにより通常のログ項目に含めることができます。 application_name には表示可能なASCII文字のみ使用することができ、それ以外の文字は疑問符( ? )に置換されます。

debug_print_parse ( boolean )
debug_print_rewritten ( boolean )
debug_print_plan ( boolean )

これらのパラメータは生成される各種デバッグ出力を有効にします。 設定すると実行された問い合わせそれぞれに対し、最終的な解析ツリー、問い合わせリライタの出力、実行計画を出力します。 これらのメッセージは LOG メッセージレベルで出力されますので、デフォルトではサーバログに出力され、クライアントには渡されません。 client_min_messages log_min_messages またはその両方を調整することで変更することができます。 デフォルトではこれらのパラメータは無効です。

debug_pretty_print ( boolean )

設定された場合、 debug_print_parse debug_print_rewritten 、または debug_print_plan で生成されたメッセージを字下げします。設定されない場合の "コンパクト" 形式よりもより見やすく、しかしより長いものとなります。デフォルトは有効です。

log_checkpoints ( boolean )

チェックポイントおよびリスタートポイントをサーバログに記録するようにします。 書き出されたバッファ数や書き出しに要した時間など、いくつかの統計情報がこのログメッセージに含まれます。 このパラメータは postgresql.conf ファイルまたはサーバのコマンドラインでのみ設定可能です。 デフォルトはoffです。

log_connections ( boolean )

これにより、クライアント認証の成功終了などのサーバへの接続試行がログに残ります。 このパラメータはセッションが開始された後は変更できません。 デフォルトはoffです。

注意: psql などクライアントプログラムの中には、パスワードを要求されると決定まで2回接続を試みるので、二重の "connection received" メッセージは必ずしも問題を示すものではありません。

log_disconnections ( boolean )

これは log_connections と同様の内容をサーバログに行として出力します。 しかし、セッションが完了した時点であって、かつセッションが持続していたことが条件です。 デフォルトではoffです このパラメータはセッションが開始された後は変更できません。

log_duration ( boolean )

すべての完了した文について、その経過時間をログするようにします。 デフォルトは off です。 スーパーユーザのみがこの設定を変更することができます。

拡張問い合わせプロトコルを使用するクライアントでは、Parse、Bind、Executeそれぞれの段階で要した時間が独立して記録されます。

注意: このオプションと log_min_duration_statement を0に設定する方法との違いは、 log_min_duration_statement を超えた場合、テキスト版の問い合わせが強制的に出力されるのに対して、このオプションでは出力されないという点です。 したがって、 log_duration on 、かつ、 log_min_duration_statement が正の値を持つ場合、すべての経過時間がログに記録されますが、閾値を超えた文のみがテキスト版の問い合わせが含められるようになります。 この動作は、高負荷なインストレーションで統計情報を収集する際に有用です。

log_error_verbosity ( enum )

ログ取得されるそれぞれのメッセージに対し、サーバログに書き込まれる詳細の量を制御します。 有効な値は、 TERSE DEFAULT 、および VERBOSE で、それぞれは表示されるメッセージにより多くのフィールドを追加します。 TERSE DETAIL HINT QUERY 、および CONTEXT エラー情報を除外します。 VERBOSE 出力は、 SQLSTATE エラーコード( 付録A も参照)、および、ソースコードファイル名、関数名、そしてエラーを生成した行番号を含みます。 スーパユーザのみこの設定を変更できます。

log_hostname ( boolean )

デフォルトでは、接続ログメッセージは接続元ホストのIPアドレスのみを表示します。 このパラメータを有効にすると、ホスト名もログに残るようになります。 ホスト名解決方法の設定に依存しますが、これが無視できないほどの性能劣化を起こす可能性があることに注意してください。 このパラメータは postgresql.conf ファイル内またはサーバのコマンドラインでのみ設定可能です。

log_line_prefix ( string )

これは、各ログ行の先頭に出力する printf の書式文字列です。 % から始まる "エスケープシーケンス" は、後述の通りのステータス情報で置き換えられます。 この他のエスケープは無視されます。 他の文字はそのままログ行に出力されます。 エスケープの中には、セッションプロセスによってのみ認識可能なものがあり、これらはメインサーバプロセスなどのバックグラウンドプロセスでは無視されます。 このパラメータは、 postgresql.conf ファイル、または、サーバのコマンドラインでのみで設定することができます。 デフォルトは空文字列です。

エスケープ 効果 セッションのみ
%a アプリケーション名
%u ユーザ名
%d データベース名
%r 遠隔ホスト名、またはIPアドレス、およびポート番号
%h 遠隔ホスト名、またはIPアドレス
%p プロセス識別子 ×
%t ミリ秒無しのタイムスタンプ ×
%m ミリ秒付きタイムスタンプ ×
%i コマンドタグ。セッションの現在のコマンド種類
%e SQLSTATE エラーコード ×
%c セッションID。下記参照 ×
%l 各セッションまたは各プロセスのログ行の番号。1から始まります。 ×
%s プロセスの開始タイムスタンプ ×
%v 仮想トランザクションID(backendID/localXID) ×
%x トランザクションID (未割り当ての場合は0) ×
%q 何も出力しません。 非セッションプロセスではこのエスケープ以降の出力を停止します。 セッションプロセスでは無視されます。 ×
%% % 文字そのもの ×

%c エスケープは、2つの4バイトの16進数(先頭のゼロは省略)をドットで区切った構成の、準一意なセッション識別子を表示します。 この数値はプロセスの起動時間とそのプロセスIDです。 したがって、 %c を使用して、これらの項目を出力するための文字数を省略することができます。例として、 pg_stat_activity からセッション識別子を生成するには以下の問い合わせを行ないます。

SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' ||
       to_hex(pid)
FROM pg_stat_activity;

ティップ: log_line_prefix に空白文字以外の値を設定する場合、通常、ログ行の残りとの区切りを明確にするために、その最後の文字を空白文字にすべきです。 句読点用の文字も使用できます。

ティップ: Syslog は独自にタイムスタンプとプロセスID情報を生成します。 ですのでおそらく、 Syslog にログを保管する場合は、こうしたエスケープを含めるとは考えないでしょう。

log_lock_waits ( boolean )

セッションがロックの獲得までの間に deadlock_timeout より長く待機する場合にログメッセージを生成するかどうかを制御します。 これは、ロックが待たされ性能がでていないのかどうか決める時に有用です。 デフォルトは off です。

log_statement ( enum )

どのSQL文をログに記録するかを制御します。 有効な値は、 none (off)、 ddl mod 、および all (全てのメッセージ)です。 ddl は、 CREATE ALTER 、および DROP 文といった、データ定義文を全てログに記録します。 mod は、全ての ddl 文に加え、 INSERT UPDATE DELETE TRUNCATE 、および COPY FROM といった、データ変更文をログに記録します。 PREPARE EXPLAIN ANALYZE コマンドも、そこに含まれるコマンドが適切な種類であればログが録られます。 拡張問い合わせプロトコルを使用するクライアントでは、Executeメッセージを受け取った時にBindパラメータの値が(すべての単一引用符が二重にされた常態で)含まれていた場合、ログに記録されます。

デフォルトは none です。スーパユーザのみこの設定を変更できます。

注意: ログメッセージの発行は、基本解析により文の種類が決まった後に行われますので、 log_statement = all という設定を行ったとしても、単純な構文エラーを持つ文は記録されません。 拡張問い合わせプロトコルの場合も同様に、この設定ではExecute段階以前(つまり、解析や計画作成期間)に失敗した文は記録されません。 こうした文のログを記録するには、 log_min_error_statement ERROR (以下)に設定してください。

log_temp_files ( integer )

一時ファイル名と容量を制御します。 一時ファイルはソート処理やハッシュ処理、一時的な問い合わせの結果のために作成されます。 ログの項目はすべての一時ファイルそれぞれについて削除されたときに生成されます。 ゼロという値ではすべての一時ファイル情報のログが残ります。 正数ではキロバイト単位の指定値以上の容量のファイルのみがログに残ります。 デフォルトの設定は-1で、このログ処理を無効にします。 スーパーユーザのみがこの設定を変更できます。

log_timezone ( string )

サーバログに書き出す際に使用される時間帯を設定します。 TimeZone と異なり、すべてのセッションで一貫性を持ってタイムスタンプが報告されるようにこの値はクラスタ全体に適用されます。 組み込まれているデフォルトは GMT ですが、 postgresql.conf により通常は上書きされます。 initdb によりこれらと関連した設定をシステム環境にインストールされます。 詳細は 項8.5.3 を参照してください。 このパラメータは postgresql.conf 内またはサーバのコマンドラインでのみ設定することができます。

18.8.4. CSV書式のログ出力の利用

log_destination リストに csvlog を含めることは、ログファイルをデータベーステーブルにインポートする簡便な方法を提供します。このオプションはカンマ区切り値書式(( CSV )で以下の列を含むログ行を生成します。 ミリ秒単位のtimestamp、 ユーザ名、 データベース名、 プロセス識別子、 クライアントホスト:ポート番号、 セッション識別子、 セッション前行番号、 コマンドタグ、 セッション開始時間、 仮想トランザクション識別子、 通常トランザクション識別子、 エラーの深刻度、 SQL状態コード、 エラーメッセージ、 詳細エラーメッセージ、 ヒント、 エラーとなった内部的な問い合わせ(もしあれば)、 内部問い合わせにおけるエラー位置の文字数、 エラーの文脈、 PostgreSQLソースコード上のエラー発生場所( log_error_verbosity verbose に設定されているならば) アプリケーション名 以下にcsvlog出力を格納するためのテーブル定義のサンプルを示します。

CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  PRIMARY KEY (session_id, session_line_num)
);

このテーブルにインポートするためには、 COPY FROM コマンドを使用してください。

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

CSVログファイルをインポートする作業を単純にするためにいくつか必要な作業があります。

  1. 一貫性があり、予測可能なログファイル命名機構を提供するために、 log_filename および log_rotation_age を設定してください。 これによりどのようなファイル名になると、個々のログファイルが完了しインポートする準備が整ったかが推測できるようになります。

  2. ログファイル名の予測が困難になりますので、 log_rotation_size を0にして容量を基にしたログの回転を無効にしてください。

  3. 同じファイルに古いログデータと新しいログデータが混在しないようにするために、 log_truncate_on_rotate on に設定してください。

  4. 上のテーブル定義にはプライマリキーの指定が含まれています。 これにより、同じ情報が2回インポートされる事故を防止するために有用です。 COPY コマンドは、一度にインポートするすべてのデータをコミットしますので、何か1つでもエラーがあればインポート全体が失敗します。 ログファイルの一部をインポートし、そのファイルが完了した後に再度インポートしようとした場合、プライマリキー違反によりインポートが失敗します。 インポートする前に、ログファイルの完了を待ち、閉じるまで待機してください。 この手順は、 COPY が失敗する原因となる、完全に書き込まれなかった欠落した行をインポートするという事故も防止します。


powered by SEO.CUG.NET