web-dev-qa-db-ja.com

stdinにログを記録するプロセスによって生成されたログのローテーション

ログファイルをstdoutに書き込む長時間実行プロセスがあります。この出力を別のファイルに保存し、メインプロセスを再起動せずに、これらのファイルを自動的に維持します(古いファイルの削除/アーカイブなど)。

解決策は、出力をファイルに送信することです(process > log.txt)、それにlogrotateを使用しますが、logrotateはプログラムを再起動する必要があり、これは不可能です。

もう1つは、出力をcronologprocess | cronolog)しかし、この場合、古いファイルは削除/アーカイブされません。つまり、メンテナンスを行うプログラムを作成する必要があります。

cronologを使用するとプロセスを再起動する必要がなく、logrotateは古いログファイルを希望どおりに維持するため、両方のユーティリティを使用できるのが最善です。これら2つのプログラムを相互に機能させる方法はありますか?そうでない場合、この問題の良い解決策は何ですか?

7
SztupY

Multilog DJBの daemontools は(ほぼ)あなたが求めていることを正確に行うことができます。私が知っている唯一の欠点は、 daemontools のパッケージを持っているディストリビューションがあまりないことです。

svc(daemontoolsの一部)でアプリケーションを管理していない場合は、次のようなコマンドに出力をパイプする方法を見つける必要があります。

multilog t s1048576 n100 ./my_log_directory

これは次のように解釈されます。

  • t:tai64nタイムスタンプを挿入します(tai64nlocalで読み取り可能な時間に変換できます)
  • s1048576:ログファイルが1MiBに拡大したらローテーションします
  • n100:100個以下のローテーションされたファイルを保持します
  • ./my_log_directory.または/で始まるもの-ログをそのディレクトリに書き込みます

書き込まれるログのファイル名はcurrentになり、マルチログがログをローテーションすると、名前が@<tai64n timestamp>.sに変更されます。ここで、ファイル名はファイルがローテーションされた時刻を示します。拡張子は、ファイルが安全にフラッシュされた場合は.s、切り捨てられた可能性がある場合は.uになります。

詳細については、リンクを確認してください。

6
chutz