
私たちは、Ubuntu サーバー上のサービスを管理するために upstart を使用しています。upstart はログを生成し、/var/log/upstart/SERVICE_NAME.log にログ出力します。
その後、12.04 LTS に付属する logrotation スクリプトを使用して、ログ ファイルが毎日ローテーションされます。
/var/log/upstart/*.log {
daily
missingok
rotate 7
compress
notifempty
nocreate
}
問題は、logrotate がファイルを移動している間、upstart にファイルを閉じて再度開くように信号が送られず、upstart プロセスが削除 PID に書き込みを続けることです。
init 1 root 8w REG 202,1 64 2431 /var/log/upstart/dbus.log.1 (deleted)
init 1 root 13w REG 202,1 95 2507 /var/log/upstart/acpid.log.1 (deleted)
init 1 root 14w REG 202,1 127 17377 /var/log/upstart/whoopsie.log.1 (deleted)
init 1 root 36w REG 202,1 122 6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init 1 root 37w REG 202,1 30 6762
もちろん、自分のサービスからの出力を他のログ ファイルにリダイレクトすることもできますが、システム プロセスでは依然として問題が残ります。また、必要以上のインフラストラクチャを構築するのは避けたいと考えています。
答え1
3つの選択肢があると思います。
「copytruncate」を追加して既存の設定を変更します
/var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }
他のログ ファイルに影響がなく、既存の構成がそれらのログ ファイルに対して機能しているために、既存の logrotate 構成を変更できない (または変更が許可されていない) 場合は、必要に応じて「SERVICE_NAME.log」ファイルを /var/log の下の新しいフォルダーに移動し、「copytruncate」を使用して新しい構成を作成し、それを cron.daily に追加します。
a) ホスト OS の logrotate 設定を変更したり、ホスト OS の cron.daily に追加したりできない場合、3 番目のオプションは、ファイルに書き込む前にファイルが存在するかどうかを確認するようにスクリプトまたはプログラムを変更することです。 b) 別の方法は、上記のポイント 2 と少し似ていますが、ログファイルを別の場所に移動し、スクリプトまたはプログラム内で、そのプログラムのログファイルに固有の logrotate コマンドを実行します。
上記のポイント 3b はよりトリッキーですが、よりエレガントであり、プログラムが自立的かつ自己管理され、OS のジョブによる監視を必要としないことを意味するため、私がほとんどの場合に使用するものです。
logrotate を手動で実行し、プログラムまたはスクリプトに追加する方法を確認するには、次のように入力します。
man logrotate
または
logrotate --help
プログラムに Python を使用している場合は、このプログラムが Python を使用してログ ファイルを自己管理する方法を確認できます。 http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/
答え2
これは既知の問題であり、チケットこれを入力している時点では開いたままです。
おそらく、正しい方法は、 を/etc/logrotate.d/upstart
すべて削除し、個々のサービスのファイルを個別にローテーションすることです。ディレクトリ ( /var/log/upstart/
) には、さまざまなサービスの stdout/stderr のみが含まれており、デーモンこれら 2 つのチャネルに出力する必要があります。ただし、起動時だけは例外です。
私が管理しているシステムでは、、、の 3 つのサービスが upstart によって実行されます。3 つphp5.6-fpm
のログはいずれもアクティブではありませphp7.1-fpm
んacpid
が、メイン ログ ファイル () がローテーションされたために fpm が再起動されることが/var/log/php5.6-fpm.log
あります。起動時に何らかの無意味な出力が出力されるため、このノイズが発生します。
どうしてもこれらのファイルをローテーションする必要がある場合は、ファイルの名前がサービスの名前と一致するという事実を信頼して、次のpostrotate
スクリプトを使用できます。
postrotate
service=${1##*/}
service=${service%.log*}
service $service restart > /dev/null
endscript
上記のことを機能させるには、必ずないそこに動詞を使用します。私のスクリプトレットは、ファイルへの実際のパスが最初の引数 ( ) として渡されるという事実に依存していますsharedscripts
$1
。
(-command はノイズが多いため、へのリダイレクト/dev/null
が便利ですservice
。また、cron によってそのようなノイズが電子メールで送られてくるのは望ましくありません。stderr
ここではリダイレクトしていませんstdout
。問題が発生した場合、それに関する電子メールが引き続き送信されます。)