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


13

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


logrotateを使用してからrm -f *.tar.gz.*
Marco Ceppi

1
ログをローテーションしたり、logrotateを使用したりしない特別な理由はありますか?正確に何をしたいですか?古いログを1Mでアーカイブし、新しいログを開始しますか?質問の始まりは終わりと完全に互換性がありません。
デビッドソーンリー

何んてpoped意味ですか?
シェパン

回答:


4

これを行うには、小さな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.

3
「ファイルを上書き」すると、新しいファイルのログは自動的に再開されないことは比較的確信しています。
スティーブンヤズジェウスキ

0

唯一の解決策は、独自のユーザースペースファイルシステムを作成するか、既存のユーザースペースファイルシステムに貢献することです。UserspaceのFilesystemにある部分的なリストを見てください

貢献するスキルがない場合は、プロジェクトの宣伝または$$$またはその両方を提供して追加してください。

私はそれをする時間があればいいのに、私はいつもまさにこのような何かを望んでいました。


0

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

0

これが私の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が実行されるようにできると思いますが、今はわかりません。


0
 *プルーン-に記載されているファイルのリストの上部を切り取ります
 *ファイル/ 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

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=ja&ie=UTF-8&q=prune+log+file&pli=1

多くの(ほとんど?すべて?)デーモンは、HUPシグナルを送信するとログファイルを再度開きます(たとえば、pruneを実行する同じcronジョブによって)


0

オリジナルのポスターが8年後に解決策を見つけたと確信しています。このスレッドを読む可能性のある他の人のための別のものがあります...

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

run_program | curtail -s 200M myprogram.log

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.