Mengubah file log menjadi semacam buffer melingkar

22

Teman-teman, apakah ada solusi * nix yang akan membuat file log bertindak sebagai buffer melingkar? Misalnya, saya ingin file log untuk menyimpan data maksimum 1Gb dan membuang entri yang lebih lama setelah batas tercapai.

Apakah ini mungkin? Saya percaya untuk mencapai bahwa file log harus diubah menjadi semacam perangkat khusus ...

PS Saya tahu ada alat logrotating lain-lain tapi ini bukan yang saya butuhkan. Logrotating membutuhkan banyak IO, biasanya terjadi sekali sehari sementara saya membutuhkan solusi "runtime".

pachanga
sumber
3
Saya tidak yakin mengapa Anda berpikir rotasi log akan membutuhkan banyak IO. Memutar 10 file log adalah 10 operasi penggantian nama dan HUP layanan. Bukan operasi pembunuhan ... Dan itu adalah solusi standar untuk masalah Anda :)
pehrs
2
Seseorang mungkin menjalankan skrip / executable yang tidak cocok dengan HUP.
Scott
1
Ini untuk menyediakan kasus penggunaan lain untuk pertanyaan Anda. Saya memiliki pemutar musik yang di-iblis. Saya ingin log panjang hanya beberapa baris, sehingga saya bisa melihat apa yang sedang diputar, dan apa yang dimainkan sebelumnya. A tail -f somefileakan melakukan itu. Saya hanya mencoba dengan log yang diputar dan tail -ftidak bekerja dengan itu.
Vorac

Jawaban:

14

Linux memiliki buffer ring kernel. Anda dapat menggunakannya dmesguntuk menampilkannya .

Atau di sini adalah modul kernel Linux yang tampaknya melakukan apa yang Anda inginkan.

Apa itu emlog?

emlog adalah modul kernel Linux yang memudahkan untuk mengakses keluaran terbaru (dan hanya yang terbaru) dari suatu proses. Ini berfungsi seperti "tail -f" pada file log, kecuali bahwa penyimpanan yang diperlukan tidak pernah tumbuh. Ini dapat berguna dalam sistem tertanam di mana tidak ada cukup memori atau ruang disk untuk menyimpan file log lengkap, tetapi pesan debugging terbaru kadang-kadang diperlukan (misalnya, setelah kesalahan diamati).

Modul kernel emlog mengimplementasikan driver perangkat karakter sederhana. Pengemudi bertindak seperti pipa bernama yang memiliki buffer melingkar yang terbatas. Ukuran buffer mudah dikonfigurasi. Karena lebih banyak data ditulis ke dalam buffer, data terlama dibuang. Proses yang membaca dari perangkat emlog pertama-tama akan membaca buffer yang ada, kemudian melihat teks baru saat ditulis, mirip dengan memonitor file log menggunakan "tail -f". (Bacaan non-pemblokiran juga didukung, jika suatu proses perlu mendapatkan konten log saat ini tanpa memblokir untuk menunggu data baru.)

Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
Terima kasih untuk tautannya! BTW, halaman muka emlog memiliki tautan ke ulogbufd yang mungkin merupakan solusi yang lebih tepat untuk saya.
pachanga
The emlog kernel modul sekarang dipertahankan pada github: github.com/nicupavel/emlog
dbernard
4

Hal terdekat yang bisa saya pikirkan adalah RRDTools, tapi mungkin itu bukan yang Anda cari. Solusi lain adalah memonitor file log (katakan setiap detik atau di Linux dengan inotify), misalnya Anda menulis skrip seperti:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

dengan inotify:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done
Dan Andreatta
sumber
+1 untuk menyebutkan RRDtool, contoh nyata pencatatan struktur data cincin.
Cory J
Terima kasih misalnya menunjukkan penggunaan perintah shell inotifywait
pachanga
4

Anda dapat menggunakan multilog dari Daemontools djb. Anda menyalurkan output log Anda ke dalamnya. Ya itu rotasi log, tetapi rotasi sederhana:

ln current $tai64nlocaltimestamp

Yang mana, pada sembarang sistem berkas linux modern adalah operasi yang super cepat. Anda dapat menentukan berapa banyak file log yang Anda inginkan, seberapa besar yang Anda inginkan. buat file 10 x 1024mb, dan Anda akan memiliki buffer cincin 1gb.

Perhatikan, bahwa karena rotasi otomatis, ini merupakan satu sumber per instance multilog. Tapi Anda bisa mengatasinya dengan menulis pembungkus sederhana dengan netcat atau dengan tangan.

Jason
sumber
Terima kasih atas tipnya! Saya pasti akan memiliki multilog juga.
pachanga
1

Anda bisa membuat pipa FIFO dan kemudian membacanya menggunakan skrip yang menyisipkan ke database. Ketika penghitung mencapai 1.000, mulai ulang nomor id yang dimasukkan ke database. Tidak akan bekerja untuk ukuran tentu saja, tetapi Anda menggunakannya sebagai contoh, jadi saya berasumsi ini adalah pertanyaan teoretis.

berdosa
sumber
1

Pertanyaan menarik; Anda biasanya tidak melihatnya sebagai desain. Saya memang memiliki program yang menggunakan teknik yang sedikit mirip untuk merekam sejarah, tetapi menggunakan format biner. 'File log' memiliki empat bagian, semua ditata dalam format netral-mesin:

  1. Header yang berisi angka ajaib dan jumlah entri (maksimum) dalam daftar yang digunakan dan daftar bebas, nomor urut untuk entri riwayat berikutnya, jumlah aktual entri dalam daftar yang digunakan, jumlah aktual entri dalam daftar gratis , dan panjang file (masing-masing 4 byte).
  2. Daftar yang digunakan, setiap entri memberikan offset dan panjang (4 byte untuk setiap bagian dari setiap entri).
  3. Daftar gratis, setiap entri mirip dengan entri daftar yang digunakan.
  4. Data utama, setiap catatan sejarah yang terdiri dari serangkaian byte yang berdekatan diakhiri oleh byte terminator nol.

Ketika catatan baru dialokasikan, jika ada ruang dalam daftar gratis, maka ia menimpa entri di sana (tidak harus menggunakan semuanya - dalam hal ini fragmen tetap ada dalam daftar gratis). Ketika tidak ada ruang dalam daftar gratis, maka ruang baru dialokasikan di akhir. Ketika catatan lama diputar, ruangnya dipindahkan ke daftar gratis, dan bergabung dengan catatan gratis yang berdekatan. Ini dirancang untuk menangani pernyataan SQL sehingga catatan dapat tersebar di banyak baris. Kode ini berfungsi pada sejumlah catatan tertentu. Itu tidak membatasi ukuran file per se (meskipun tidak akan sulit untuk melakukannya).

Kode sejarah utama kode ada dalam dua file, history.c dan history.h, tersedia dari sumber untuk program SQLCMD (versi saya, bukan milik Microsoft; milik saya sudah ada satu dekade atau lebih sebelum Microsoft), yang dapat diunduh dari Arsip Perangkat Lunak Kelompok Pengguna Informix Internasional . Ada juga program dump file histori (histdump.c) dan tester sejarah (histtest.ec - ia mengklaim sebagai ESQL / C, tetapi itu sendiri benar-benar kode C; salah satu fungsi dukungan yang dipanggil menggunakan beberapa Informix ESQL / C fungsi perpustakaan). Hubungi saya jika Anda ingin bereksperimen tanpa menggunakan Informix ESQL / C - lihat profil saya. Ada beberapa perubahan sepele yang harus dilakukan untuk mengkompilasi histtest di luar lingkungan desainnya, plus Anda perlu makefile.

Jonathan Leffler
sumber
0

Saya setuju dengan komentar pehrs untuk pertanyaan Anda. Rotasi log tidak terlalu sulit. Anda dapat mengatur logrotate atau skrip lain untuk secara berkala memeriksa file log Anda, bahkan sesering setiap menit jika diinginkan. Ketika mendeteksi file Anda mencapai ukuran 1GB, itu hanya melakukan penggantian nama, yang hampir tidak memerlukan I / O. Selama mengganti nama proses terus menulis file log. Log rotator dapat mengirim HUP ke daemon syslog Anda (daemon Anda adalah penebangan melalui syslog, kan? Jika tidak, harus mendukung sinyal HUP jika itu ditulis dengan baik ...) untuk memilikinya kembali membuka jalur file asli . Pada titik ini akan mulai menulis ke file baru di jalur asli dan Anda dapat menghapus versi yang diputar.

Kamil Kisiel
sumber