logrotate を使用せずにログファイルのサイズを固定する

logrotate を使用せずにログファイルのサイズを固定する

新しい空のファイルでローテーションしたり、古いファイルを削除 (またはアーカイブ) したりせずに、ログ ファイルのファイル サイズを固定する方法はありますか。たとえば、ログ ファイルの最大サイズを 1 MB に設定した場合、ファイル サイズがその制限を超えると自動的にクランプされ、テキストが「末尾」に追加され、テキストの最も古い部分がポップアウトされて、ファイル サイズが 1 MB に維持されます。

答え1

これを行うには、小さな bash スクリプトを書くことができます。 を使用して、ファイルを特定のバイト数まで追跡し、tail -cファイルを上書きするだけです。

からman tail

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

答え2

元の投稿者は 8 年後に解決策を見つけたと確信しています。このスレッドを読んでいる他の人のために、もう 1 つ解決策を示します...

curtail は、次のコマンドを使用してプログラムの出力のサイズを制限し、最後の 200 MB の出力を保持します。

run_program | curtail -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

答え3

唯一の解決策は、独自のユーザー空間ファイルシステムを作成するか、既存のファイルシステムに貢献することかもしれません。部分的なリストをご覧ください。ユーザー空間のファイルシステム

貢献できるスキルがない場合は、プロジェクトの宣伝や資金、またはその両方を提供して、代わりに貢献してもらいましょう。

それをやる時間があればいいのにと思います。私はずっとこれとまったく同じことをしたいと思っていました。

答え4

これが私の2番目の答えです。これはかなりハックっぽいです。

watch(1) を使用して繰り返し実行しますtail --bytes=1024(ログファイルの最後の 1024 バイト。回答を提供してくれた @jjclarkson に感謝します)。

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

次に、次のコマンドでファイルを表示します。

less --raw-control-chars /tmp/messages.watch

watchと while ループの違いは、watch/var/log/messages に変更があった場合にのみ /tmp/messages.watch が更新されることです。

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

また、testwhile ループに を入れて、/var/log/messages が更新された場合にのみ tail が実行されるようにすることもできると思いますが、今はそれを理解しません。

関連情報