ログファイルをstdout
に書き込む長時間実行プロセスがあります。この出力を別のファイルに保存し、メインプロセスを再起動せずに、これらのファイルを自動的に維持します(古いファイルの削除/アーカイブなど)。
解決策は、出力をファイルに送信することです(process > log.txt
)、それにlogrotate
を使用しますが、logrotate
はプログラムを再起動する必要があり、これは不可能です。
もう1つは、出力をcronolog
(process | cronolog
)しかし、この場合、古いファイルは削除/アーカイブされません。つまり、メンテナンスを行うプログラムを作成する必要があります。
cronolog
を使用するとプロセスを再起動する必要がなく、logrotate
は古いログファイルを希望どおりに維持するため、両方のユーティリティを使用できるのが最善です。これら2つのプログラムを相互に機能させる方法はありますか?そうでない場合、この問題の良い解決策は何ですか?
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
になります。
詳細については、リンクを確認してください。