データベースサーバのログ出力を/dev/null
に渡して単に破棄するのではなく、どこかに保存しておくことを推奨します。
問題の原因を究明する時にログ出力は貴重です。
サーバログには機密情報が含まれている可能性があり、保存方法や保存場所、ルーティング先に関係なく保護する必要があります。
たとえば、一部のDDL文に平文のパスワードやその他の認証の詳細が含まれている場合があります。
ERROR
レベルで記録された文には、アプリケーションのSQLソースコードが表示され、データ行の一部も含まれる場合があります。
データ、イベントおよび関連情報の記録は、この機能の意図した機能であるため、これは漏洩やバグではありません。
サーバログは、適切に権限を与えられたユーザーにのみ見えるようにしてください。
ログ出力は(特により高いデバッグレベルの時に)巨大になる傾向があるので、際限なく保存したくはないでしょう。 適切な期間を経過した後に、新しいログファイルが開始され、古いログファイルが削除されるように、ログファイルをローテーションする必要があります。
単にpostgres
のstderrをファイルに渡している場合、ログ出力を保持できますが、そのログファイルを切り詰めるためにはサーバを停止させ、再度起動させるしか方法がありません。
開発環境でPostgreSQLを使用しているのであればこれで構いませんが、実運用サーバでこの振舞いが適切となることはほぼありません。
サーバのstderrを何らかのログローテーションプログラムに送信する方が良いでしょう。
組み込みのログローテーション機能があり、postgresql.conf
のlogging_collector
設定パラメータをtrue
に設定することでこれを使用することができます。
このプログラムを制御するパラメータについては20.8.1で説明します。
また、この方法を使用して、機械読み取りしやすいCSV(カンマ区分値)書式でログデータを取り込むことができます。
また、既に他のサーバソフトウェアで使用している外部のログローテーションプログラムがあるのであれば、それを使用したいと考えるでしょう。
例えば、Apache配布物に含まれるrotatelogsをPostgreSQLで使用することができます。
これを行う一つの方法は、単にサーバのstderrを目的のプログラムにパイプで渡すことです。
pg_ctl
を使用してサーバを起動している場合はstderrは既にstdoutにリダイレクトされていますので、以下の例のようにコマンドをパイプする必要があるだけです。
pg_ctl start | rotatelogs /var/log/pgsql_log 86400
PostgreSQL組み込みのログ収集機構により生成されるログファイルを集めるのにlogrotateを設定することで、上の方法を組み合わせることができます。
この場合、ログ収集機構はログファイルの名前と位置を定義する一方、logrotateは周期的にそのファイルをアーカイブします。
ログローテーションを開始する時に、logrotateはアプリケーションが以降の出力を新しいファイルに送ることを確実にしなければなりません。
通常これは、アプリケーションにSIGHUP
シグナルを送るpostrotate
スクリプトにより行なわれ、アプリケーションはその後ログファイルを再度開きます。
PostgreSQLでは、その代わりにpg_ctl
にlogrotate
オプションを付けて実行できます。
サーバはこのコマンドを受け取ると、ログ収集の設定に応じて新しいログファイルに切り替えるか、既存のファイルを再度開くかします(20.8.1を参照してください)。
静的なログファイル名を使う場合には、開けるファイルの最大数に達したりファイルテーブルのオーバーフローが起きた場合に、サーバがログファイルを再度開くのに失敗するかもしれません。
この場合には、ログローテーションが成功するまでログメッセージは古いログファイルに送られます。
logrotateがログファイルを圧縮して削除するよう設定されていれば、サーバはこの期間にログに残そうとしたメッセージを失うかもしれません。
この問題を避けるため、ログファイル名を動的に割り当てて、開いているログファイルを無視するprerotate
スクリプトを使うようにログ収集機構を設定できます。
この他の実運用レベルのログ出力の管理方法は、syslogに送信し、syslogにファイルのローテーションを行わせることです。
このためには、postgresql.conf
のlog_destination
設定パラメータをsyslog
(syslogのみにログを出力)に設定してください。
そして、新しいログファイルへの書き込みを始めたい時に、syslogデーモンにSIGHUP
シグナルを送信してください。
ログローテーションを自動化させたい場合は、logrotateプログラムを設定することで、syslogからのログファイルを扱うことができます。
しかし、多くのシステムではsyslogは特に巨大なログメッセージに関してあまり信頼できません。
必要なメッセージを切り詰めてしまったり、破棄してしまったりする可能性があります。
また、Linuxでは、syslogはメッセージごとにディスクに書き出すため、性能が良くありません。
(同期化を無効にするため、syslog設定ファイル内のファイル名の先頭に「-
」を使うことができます。)
上述の手法は全て、新しいログファイルを開始する周期を設定することができますが、古い、既に役に立たなくなったログファイルの削除は扱わないことに注意してください。 おそらく定期的に古いログファイルを削除するバッチジョブを設定することになるでしょう。 他に、ローテーション用プログラムを設定して古いログファイルを周期的に上書きさせるという方法もあります。
pgBadgerという外部プロジェクトは洗練されたログファイルの解析を行います。 check_postgresは、通常ではない多くの状態の検出を行うのと同時にログファイルに重要なメッセージが現れた時にNagiosで警告する機構を提供します。