ログファイルのファイルサイズを、新しい空のファイルでローテーションして古いファイルを削除(またはアーカイブ)せずに固定する方法はありますか。たとえば、ログファイルの最大サイズを1MBに設定すると、ファイルサイズがその制限を超えて増加すると自動的にクランプされ、テキストは「テール」に追加され、テキストの最も古い部分がポップアウトされてファイルサイズが1MBに維持されます。
ログファイルのファイルサイズを、新しい空のファイルでローテーションして古いファイルを削除(またはアーカイブ)せずに固定する方法はありますか。たとえば、ログファイルの最大サイズを1MBに設定すると、ファイルサイズがその制限を超えて増加すると自動的にクランプされ、テキストは「テール」に追加され、テキストの最も古い部分がポップアウトされてファイルサイズが1MBに維持されます。
回答:
これを行うには、小さな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.
唯一の解決策は、独自のユーザースペースファイルシステムを作成するか、既存のユーザースペースファイルシステムに貢献することです。UserspaceのFilesystemにある部分的なリストを見てください
貢献するスキルがない場合は、プロジェクトの宣伝または$$$またはその両方を提供して追加してください。
私はそれをする時間があればいいのに、私はいつもまさにこのような何かを望んでいました。
FIFOを使用して同様のことを行うことができます。FIFOは、サイズが0バイトのファイルのようなものです。
ただし、このファイルから何も読み取っていない場合、syslogプロセスがブロックされ、すべてのログファイルへの書き込みが停止する可能性があることに注意してください。Ubuntu / CentOSの新しいバージョンでこの動作が変更されたかどうかはわかりません。
ここの一例
別の例として、このようなものを試してください。
FIFOを作成します。
sudo mkfifo /var/log/everything.fifo
そして、これを(r)syslog.confに追加し、syslogを再起動します:
*.* |/var/log/everything.fifo
次に、1つのウィンドウからFIFOを表示します。
cat /var/log/everything.fifo
そして、別のウィンドウで、syslogにいくつかのものを送信します。
logger Test1
logger Test2
logger Test3
cat
上記の出力に「Test *」行が表示されます。
この機能は、特にデータを長期間保持する必要がない場合に、デバッグに最適です。たとえば、ファイアウォールスパム以外のすべてを表示したい場合は、次のようなことができます。
grep -vi "kernel: .* on wan" /var/log/everything.fifo
これが私の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
またtest
、whileループに入れて、/ var / log / messagesが更新された場合にのみtailが実行されるようにできると思いますが、今はわかりません。
*プルーン-に記載されているファイルのリストの上部を切り取ります *ファイル/ etc / default / prune。定期的に実行されるように設計 * cronからの考え方は、ログを自動的に短縮することです *永遠に成長するファイル。このファイルには、 *ファイル(フルパス名)、およびブロックの数 *保持する必要があります。健全性を保つために、プルーンは *次の改行の後にファイルをクリップします。ファイル * / etc / default / pruneは次のようになります。 * * / usr / adm / aculog 10 * /usr/adm/leo.log 5 * / usr / adm / messages 200 * / usr / adm / sup_log 5 * *プルーンのinfoswxのcrontabエントリは次のようになります。 * * 0 5 * * * / etc / prune> /usr/adm/prune.log 2>&1 * *コンパイル:cc -O -o prune prune.c * *次の定義は、好みに合わせて調整できます *およびシステムブロックサイズ。 * *レイデイビスinfoswx!bees 09/25/85
多くの(ほとんど?すべて?)デーモンは、HUPシグナルを送信するとログファイルを再度開きます(たとえば、pruneを実行する同じcronジョブによって)
オリジナルのポスターが8年後に解決策を見つけたと確信しています。このスレッドを読む可能性のある他の人のための別のものがあります...
curtailは、プログラムの出力のサイズを制限し、次のコマンドで最後の200MBの出力を保持します。
run_program | curtail -s 200M myprogram.log
rm -f *.tar.gz.*