他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

18.7.1. ログの出力先

log_destination (文字列)

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

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

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

local0.*    /var/log/postgresql

logging_collector論理値

このパラメータにより、stderrおよびCSV書式のログ出力に送られるメッセージを取り出し、ログファイルにリダイレクトすることができます。 この方法はsyslogへのログよりもしばしば有用です。 メッセージの一部の種類がsyslogでは出力されない可能性があるためです (一般的な例として、ダイナミックリンカのエラーメッセージがあります)。 このパラメータはサーバ起動時のみ設定可能です。

log_directory文字列

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

log_filename文字列

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

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

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

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

log_rotation_age整数

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

log_rotation_size整数

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

log_truncate_on_rotation論理値

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

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

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

syslog_facility (enum)

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

syslog_ident文字列

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

silent_mode (論理値)

サーバをメッセージ出力なしで実行します。 このパラメータを設定すると、サーバは自動的にバックグラウンドで起動し、制御端末を切り離します。 このパラメータはサーバ起動時にのみ設定可能です。

注意

このパラメータが設定されると、サーバの標準出力と標準エラーはディレクトリ内のpostmaster.logファイルにリダイレクトされます。 このファイルを使い廻す方策はありません。従って、他の設定でサーバのログ出力が別のどこかにリダイレクトされない限り理由なく肥大化します。log_destinationsyslogに設定するか、そのlogging_collectorオプションを設定するときに有効にします。これらの対策を施しても、通常のログ送り先ではなくpostmaster.logファイルに起動時点のエラーが報告されることがあります。

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

client_min_messagesenum

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

log_min_messagesenum

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

log_error_verbosityenum

ログされたそれぞれのメッセージに対しサーバログ内に書き込まれる詳細度合を制御します。有効な値は、TERSEDEFAULT、およびVERBOSEで、それぞれ表示するメッセージのフィールドが追加されていきます。スーパーユーザのみがこの設定を変更することができます。

log_min_error_statementenum

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

log_min_duration_statement整数

文の実行に少なくとも指定したミリ秒数かかった場合、それぞれの文の実行に要した時間をログに記録します。 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. メッセージ深刻度レベル

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

18.7.3. 何をログに

debug_print_parse論理値
debug_print_rewritten論理値
debug_print_plan論理値

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

debug_pretty_print論理値

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

log_checkpoints (論理値)

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

log_connections論理値

これにより、クライアント認証の成功終了などのサーバへの接続試行がログに残ります。 このパラメータはpostgresql.confファイル内、または、サーバのコマンドラインでのみで設定されます。 デフォルトは無効です。

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

log_disconnections論理値

これはlog_connections同様の出力をサーバログに行い、さらに加えて、セッション終了時にセッションの期間も出力します。 デフォルトではこれは無効です。 このパラメータはpostgresql.confファイル内、または、サーバのコマンドラインでのみで設定可能です。

log_duration論理値

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

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

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

log_hostname (論理値)

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

log_line_prefix文字列

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

エスケープ効果セッションのみ
%uユーザ名
%dデータベース名
%r遠隔ホスト名、もしくはIPアドレスとポート番号
%h遠隔ホスト名、もしくはIPアドレス
%pプロセス識別子×
%tミリ秒無しのタイムスタンプ×
%mミリ秒付きタイムスタンプ×
%iコマンドタグ。セッションの現在のコマンド種類
%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(procpid)
FROM pg_stat_activity;

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

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

log_lock_waits (論理値)

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

log_statement (enum)

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

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

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

log_temp_files (整数)

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

log_timezone (文字列)

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

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

log_destinationリストにcsvlogを含めることは、ログファイルをデータベーステーブルにインポートする簡便な方法を提供します。 このオプションは、ミリ秒単位のタイムスタンプ、ユーザ名、データベース名、プロセスID、ホスト:ポート番号、セッションID、セッション単位またはプロセス単位の行番号、コマンドタグ、セッション開始時刻、仮想トランザクションID、正規トランザクションID、エラー深刻度、SQL stateコード、エラーメッセージ、詳細エラーメッセージ、ヒント、エラーとなった内部的な問い合わせ(もしあれば)、内部問い合わせにおけるエラー位置の文字数、エラーの文脈、エラーをもたらしたユーザ問い合わせ(存在し、かつ、log_min_error_statementが有効ならば)、ユーザ問い合わせにおけるエラー位置の文字数、PostgreSQLソースコード上のエラー発生場所(log_error_verbosityverboseに設定されているならば)という列からなるカンマ区切り値書式のログ行を生成します。 以下に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,
  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_rotateonに設定してください。

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