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

23.3. ログファイルの保守

データベースサーバのログ出力を /dev/null に渡して単に破棄するのではなく、どこかに保存しておくことを推奨します。 問題の原因を究明する時にログ出力は貴重です。 しかし、ログ出力は(特により高いデバッグレベルの時に)巨大になりがちですので、際限なく保存したくはないでしょう。 新しいログファイルを開始させ、適切な期間を経過した古いログファイルを捨てるために、ログファイルを "回転" させる必要があります。

単に postgres stderr をファイルに渡している場合、ログ出力を保持できますが、そのログファイルを切り詰めるためにはサーバを停止させ、再度起動させるしか方法がありません。 開発環境で PostgreSQL を使用しているのであればこれで構いませんが、実運用サーバでこの振舞いが適切となることはほぼありません。

サーバの stderr を何らかのログ回転プログラムに送信する方が良いでしょう。 組み込みのログ回転機能があり、 postgresql.conf logging_collector 設定パラメータを true に設定することでこれを使用することができます。 このプログラムを制御するパラメータについては 項18.8.1 で説明します。 また、この方法を使用して、機械読み取りしやすい CSV (カンマ区分値)書式でログデータを取り込むことができます。

また、既に他のサーバソフトウェアで使用している外部のログ回転プログラムがあるのであれば、それを使用したいと考えるでしょう。 例えば、 Apache 配布物に含まれる rotatelogs PostgreSQL で使用することができます。 これを行うには、単にサーバの stderr を目的のプログラムにパイプで渡してください。 pg_ctl を使用してサーバを起動している場合は stderr は既に stdout にリダイレクトされていますので、以下の例のようにコマンドをパイプする必要があるだけです。

pg_ctl start | rotatelogs /var/log/pgsql_log 86400

この他の実運用レベルのログ出力の管理方法は、 syslog に送信し、 syslog にファイルの回転を行わせることです。 このためには、 postgresql.conf log_destination 設定パラメータを syslog syslog のみにログを出力)に設定してください。 そして、新しいログファイルへの書き込みを始めたい時に、 syslog デーモンに SIGHUP シグナルを送信してください。 ログ回転を自動化させたい場合は、 logrotate プログラムを設定することで、 syslog からのログファイルを扱うことができます。

しかし、多くのシステムでは syslog は特に巨大なログメッセージに関してあまり信頼できません。 必要なメッセージを切り詰めてしまったり、破棄してしまったりする可能性があります。 また、 Linux では、 syslog はメッセージごとにディスクに書き出すため、性能が良くありません。 (同期化を無効にするため、 syslog 設定ファイル内のファイル名の先頭に - を使うことができます。)

上述の手法は全て、新しいログファイルを開始する周期を設定することができますが、古い、既に役に立たなくなったログファイルの削除は扱わないことに注意してください。 おそらく定期的に古いログファイルを削除するバッチジョブを設定することになるでしょう。 他に、回転用プログラムを設定して古いログファイルを周期的に上書きさせるという方法もあります。

pgBadger という外部プロジェクトは洗練されたログファイルの解析を行います。 check_postgres は、通常ではない多くの状態の検出を行うのと同時にログファイルに重要なメッセージが現れた時にNagiosで警告する機構を提供します。


powered by SEO.CUG.NET