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".
tail -f somefile
akan melakukan itu. Saya hanya mencoba dengan log yang diputar dantail -f
tidak bekerja dengan itu.Jawaban:
Linux memiliki buffer ring kernel. Anda dapat menggunakannya
dmesg
untuk menampilkannya .Atau di sini adalah modul kernel Linux yang tampaknya melakukan apa yang Anda inginkan.
sumber
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:
dengan inotify:
sumber
Anda dapat menggunakan multilog dari Daemontools djb. Anda menyalurkan output log Anda ke dalamnya. Ya itu rotasi log, tetapi rotasi sederhana:
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.
sumber
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.
sumber
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:
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.
sumber
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.
sumber