LogRotate のログファイルのローテーションのデフォルト方法を変更する

LogRotate のログファイルのローテーションのデフォルト方法を変更する

私の観察では、ログファイルをローテーションするには、logrotateプロセスは次の順序で実行されます。

  1. 問題のログファイル(file1.logと呼ぶ)を新しい名前(既存の名前にタイムスタンプまたは番号を追加してfile1.log-20140513となる)でコピーします。
  2. 既存のファイル (file1.log) を削除し、元の名前 (file1.log) で新しい空のログ ファイルを作成します。
  3. 回転したファイル(file1.log-20140513)を圧縮し、圧縮オプションが設定されている場合は、新しい圧縮ファイル(file1.log-20140513.gz)を作成します。
  4. ローテーションされたファイル(file1.log-20140513)を削除し、最後に、
  5. 次のファイルに移動して、上記の 4 つの手順と同じ操作を実行します。

このプロセスで次の問題が発生しています:

  1. 私のログ ファイルのサイズは非常に大きく (それぞれ 10 GB 以上)、そのようなログ ファイルが約 42 個あります。
  2. これらのファイルに書き込むプロセスは同期して動作します。
  3. サーバーの DiskIO は良好ですが、それでもコピーには時間がかかり、圧縮にも時間がかかり、圧縮でも CPU が消費されます。
  4. 新しく作成されたすべてのログ ファイルに、同じ時間から始まるログが含まれるようにします。

それを実行するには、logrotate にファイルをコピーするのではなく、mv コマンドで実行してファイル名を変更するような移動を実行させたいです。圧縮については、これを無効にして、cron でスケジュールされた別のスクリプトでトリガーすることができます。ただし、logrotate にファイルをコピーするのではなく、移動させたいです。

さて、これは logrotate の作成者も考えていたであろうことだと思います。明らかにディスク IO が節約され、logrotate 操作全体を完了するのにかかる時間が短縮されるからです。そこで、ファイルが移動または名前変更されるのではなくコピーされる理由と、logrotate でこれをどのように実現するかを知りたいです。

注: 手動で実行しようとしました。つまり、実行中のプロセスが書き込んでいたファイルを移動し、同じ名前で同じ権限 (プロセスが実行されている権限でもあるルート) を持つ新しい空のファイルを作成しましたが、移動して新しいファイルを作成した後、プロセスが何も書き込んでいないことがわかったので、そのファイルに書き込むようにプロセスを再起動する必要がありました。logrotate がプロセスに同じファイルに書き込ませることができるのに、簡単な手順ではそれができない理由について、この動作を説明できる人はいますか。

答え1

あなたが説明している動作は、logrotate がディレクティブを通じて明示的にそうするように指示された場合にのみ発生しますcopytruncate。ドキュメントでは、この動作により一部のログ データが失われる可能性があることについて警告しています。そのディレクティブは最後の手段としてのみ使用してください。

ログファイルをローテーションする標準的な方法は、名前を変更し、プロセスに信号を送信して新しいログファイルを開くようにすることです。これはより高速で、ログの一部が失われるリスクもありません。ただし、書き込みプロセスが新しいログファイルに切り替えることができる必要があります。

圧縮はオフにしたり、次のローテーションまで延期したりできます。compressディレクティブを使用すると、古いログファイルは圧縮されます。ディレクティブを使用しない場合は、圧縮されません。

compressとの両方が使用されている場合delaycompress、圧縮は次のローテーションまで延期されます。その場合、各ローテーションの後、最新の 2 つのログファイルはまだ圧縮されていません。

答え2

新しいファイルを移動して作成した後、プロセスが何も書き込んでいないことがわかったので、そのファイルに書き込むためにプロセスを再起動する必要がありました。

プロセスは同じファイルに書き込んでいます。そのため、lograte は移動ではなくコピーになります。ログを削除しても、プロセスは引き続きログに書き込み、ファイルシステムの使用量は増加しますが、ファイルは増加しません。プロセスを再起動すると、ディスク領域が解放されます。

考慮する

関連情報