Usahakan ukuran file log tetap tanpa logrotate

13

Apakah ada cara untuk menjaga ukuran file file log tetap tanpa memutarnya dengan file kosong baru dan menghapus (atau pengarsipan) file lama. Sebagai contoh, jika saya menetapkan ukuran maksimum file log ke 1MB, setelah ukuran file meningkat melebihi batas itu akan secara otomatis dijepit, teks ditambahkan pada 'tail' dan bagian tertua dari teks dihapus untuk menjaga ukuran file 1MB .

uray
sumber
gunakan logrotate, lalurm -f *.tar.gz.*
Marco Ceppi
1
Apakah ada alasan khusus mengapa Anda tidak ingin memutar log, atau menggunakan logrotate? Apa yang sebenarnya Anda inginkan terjadi? Arsipkan log lama pada 1M dan mulai yang baru? Awal pertanyaan Anda tidak cukup kompatibel dengan akhir.
David Thornley
apa artinya sembul ?
tshepang

Jawaban:

4

Anda dapat menulis skrip bash kecil untuk melakukan ini. Hanya tail file ke jumlah byte tertentu menggunakan tail -cdan menimpa file.

dari 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.
jjclarkson
sumber
3
Saya relatif yakin bahwa sekali Anda "menimpa file", logging tidak akan dilanjutkan secara otomatis pada file baru.
Stephen Jazdzewski
0

Satu-satunya solusi Anda mungkin menulis sistem file userspace Anda sendiri atau berkontribusi ke yang sudah ada. Lihatlah daftar parsial di Filesystem di Userspace

Jika Anda tidak memiliki keterampilan untuk berkontribusi, tawarkan publisitas proyek atau $$$ atau keduanya, untuk menambahkannya untuk Anda.

Seandainya saya punya waktu untuk melakukannya, saya selalu menginginkan sesuatu yang persis seperti ini.

Stephen Jazdzewski
sumber
0

Anda dapat melakukan hal serupa menggunakan FIFO, yang seperti file berukuran nol byte.

Namun, perhatikan bahwa jika tidak ada yang MEMBACA dari file ini, maka proses syslog dapat diblokir, dan akan berhenti menulis ke SEMUA dari file log Anda. Saya tidak yakin apakah perilaku ini telah diubah dengan versi Ubuntu / CentOS yang lebih baru.

Satu contoh di sini

Sebagai contoh lain, coba sesuatu seperti ini.

Buat FIFO Anda:

sudo mkfifo /var/log/everything.fifo

Dan tambahkan ini ke (r) syslog.conf, lalu mulai ulang syslog:

*.*     |/var/log/everything.fifo

Kemudian lihat FIFO dari satu jendela:

cat /var/log/everything.fifo

Dan di jendela lain, kirim beberapa barang ke syslog:

logger Test1
logger Test2
logger Test3

Anda akan melihat baris "Test *" pada output di catatas.

Fitur ini bisa bagus untuk debugging, terutama jika Anda tidak ingin menyimpan data lebih lama. Misalnya, jika Anda hanya ingin melihat semuanya kecuali untuk spam firewall, Anda dapat melakukan sesuatu seperti ini:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
Stefan Lasiewski
sumber
0

Inilah jawaban kedua saya. Ini adalah peretasan yang cukup.

Gunakan arloji (1) untuk berulang kali mengeksekusi tail --bytes=1024(1024 byte terakhir dari file log, terima kasih kepada @jjclarkson untuk jawaban itu).

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

Dan kemudian lihat file dengan:

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

Perbedaan antara watchdan loop sementara adalah yang watchhanya akan memperbarui /tmp/messages.watch jika ada perubahan pada / var / log / messages.

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

Dan yah, saya kira Anda bisa meletakkan testdalam loop sementara sehingga ekor hanya dieksekusi jika / var / log / pesan diperbarui, tapi saya tidak akan mengetahuinya sekarang.

Stefan Lasiewski
sumber
0
 * prune - klip dari bagian atas daftar file yang dijelaskan dalam
 * file / etc / default / prune. Didesain untuk dijalankan secara berkala
 * dari cron, idenya adalah untuk secara otomatis mempersingkat log
 * file yang tumbuh selamanya. File ini berisi daftar
 * File (nama path lengkap), dan jumlah blok itu
 * harus dipertahankan. Untuk mempertahankan kewarasan, pangkas kehendak
 * klip file setelah baris baru berikutnya. Berkas
 * / etc / default / prune akan terlihat seperti:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 * Entri crontab pada infoswx untuk prune terlihat seperti:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Kompilasi dengan: cc -O -o prune prune.c
 *
 * Definisi berikut dapat disesuaikan dengan selera Anda
 * dan ukuran blok sistem Anda.
 *
 * Ray Davis infoswx! Bee 09/25/85

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

Banyak (kebanyakan? Semua?) Daemon akan membuka kembali file log mereka jika mengirim sinyal HUP (mis. Dengan pekerjaan cron yang sama yang menjalankan pemangkasan)

RedGrittyBrick
sumber
0

Saya yakin poster asli telah menemukan solusi setelah 8 tahun. Berikut ini satu lagi untuk orang lain yang mungkin membaca utas ini ...

curtail membatasi ukuran output program dan mempertahankan 200MB output terakhir dengan perintah berikut:

run_program | curtail -s 200M myprogram.log

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

Dave Wolaver
sumber