読者です 読者をやめる 読者になる 読者になる

わさび唐辛子

いざという時のための備忘録

【PostgreSQL】テキストファイルへのログ収集

テキスト形式のログを出力する

 

最終的にはFluentdを使いたいけど、ひとまず普通にログ出力させる。

syslogでもいいけど、出力抜けがあったり、ログローテートとか自由に制御できないらしい(?)とかで、テキスト形式で出力。

 

まずは、ちょっと古いけどLet's Postgresでオススメされている内容で設定。

 

log_destination = 'csvlog'
logging_collector = on
log_directory = '/opt/pgsql/log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100000
log_line_prefix = '[%t][%p][%h][%u][%e]'
log_min_duration_statement = 1000
log_autovacuum_min_duration = 20000

 

・log_destination

ログ出力形式の指定。

指定可能なのは、{syslog, eventlog, stderr, csvlog}。

 

・logging_collector

stderrに送られたログメッセージをログファイルにリダイレクトすることを有効にする。わかったようなわからないような・・・

 

・log_directory

ログ出力ディレクトリ。

 

・log_filename

ログファイル名。

 

・log_rotation_age

ログファイルの生成周期。

今回の設定だと、毎日新たなログファイルを生成する(はず)。

 

・log_rotation_size

ログの最大サイズ。

このサイズを超えたら生成周期を迎える前でも新たなログを生成する。

ログは知らない内に巨大になって、いざ見たい時には見ずらいことこの上なくなることが多いので、とても大事。

 

・log_line_prefix

ログを出力する際に付与する情報を定義する。

一部の情報はリモートからSQL等を発行された際のみ出力され、バックグラウンドプロセス(DB起動等)時は空文字が出力される。

以下はマニュアルから抜粋。

 %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:何も出力しません。
     非セッションプロセスではこのエスケープ以降の
    出力を停止します。
            セッションプロセスでは無視されます。

 %%:%文字そのもの

 

・log_min_duration_statement

指定した時間以上の時間を要するSQLとその時間が出力される。

実行が遅延しているクエリを検出する。

 

・log_autovacuum_min_duration

指定した時間以上の時間を要するAUTOVACUUMが出力される。

 

設定を保存してDBを再起動したらログが出力されることを確認。

(ログディレクトリは存在しなくても自動生成される)

 

次はFluentdに挑戦。

広告を非表示にする