Saya memiliki program Linux yang dapat menulis informasi ke stdout dan stderr.
Saya memiliki skrip shell yang mengarahkan output ke file di /var/log
. (Via >>
dan 2>&1
.)
Apakah ada cara untuk membuat file log diputar? (ukuran maksimal, lalu beralih ke file lain, simpan hanya sejumlah file)
Saya telah melihat beberapa jawaban yang berbicara tentang logrotate
program, yang terdengar bagus, tetapi mereka juga tampaknya berfokus pada program yang menghasilkan file log secara internal dan menangani sinyal HUP. Apakah ada cara untuk membuat ini bekerja dengan skrip redirection output dasar?
logrotate
jika ada opsi yang lebih baik, yang hanya terdengar seperti titik awal yang nyaman untuk diskusi.Jawaban:
Sebagai alternatif, Anda dapat menyalurkan output melalui alat yang dirancang dengan tujuan utama mempertahankan set file log yang dibatasi ukuran dan dirotasi secara otomatis, seperti:
multilog
dari daemontoolsmultilog
dari daemontools-encores6-log
dari s6svlogd
dari runittinylog
dari pelakucyclog
dari noshAlat-alat untuk kemudian memproses
multilog
set file log format antara lain:multilog-watch
logrange
multilog-stamptail
follow-log-directories
dari noshexport-to-rsyslog
dari noshBacaan lebih lanjut
logrotate
ataunewsyslog
abad ini. . Jawaban yang Sering Diberikan.sumber
multilog
sepertinya yang saya butuhkan.multilog
tidak ada tempat yang menciptakan atau menuntut tautan simbolik. Itu sepenuhnya netral sehubungan dengan mereka.yang
rotatelogs
alat dikirimkan dengan apache (dalambin
dir) (lihat docs ) mengambil input dari stdin dan berputar log setelah beberapa jumlah waktu tertentusumber
Jika Anda dapat menggunakannya untuk pergi ke salah satu aliran log standar (syslog, daemon, cron, pengguna, keamanan, mail, dll.) Anda dapat menggunakan
logger
perintah dan pipa untuk itu sebagai gantinya.Jika tidak, Anda mungkin lebih baik menyaring konten yang telah dicatat ke program atau skrip khusus untuk menanganinya, atau melihat menyiapkan
logrotate
konfigurasi.EDIT: Jawaban JdeBP tampaknya memiliki apa yang Anda cari.
sumber
Saya memiliki masalah yang sama dan pada awalnya membuang logrotate tetapi ternyata logrotate sebenarnya dapat melakukan ini dengan baik, arahan kuncinya adalah " copytruncate ". Untuk beberapa alasan istilah itu tidak muncul di salah satu googling yang saya lakukan, jadi saya menambahkan jawaban ini untuk memperjelas bagaimana menggunakannya untuk kasus ini.
Kuncinya adalah ini hanya berfungsi jika pengalihan dilakukan dengan " >> " (append) bukan " > " (create).
File Konfigurasi (truncate.cfg):
Program Uji (tidak pernah menyerah file). Anda dapat melihatnya mengisi disk dan meskipun menghapus logfile akan berfungsi, sebenarnya tidak akan membebaskan ruang apa pun pada disk:
Menjalankan log rotate:
sumber
echo /dev/urandom >> /tmp/temp.log
akan menulis 13 karakter deterministik ke/tmp/temp.log
dan kemudian segera keluar. Apakah maksud Andacat /dev/urandom
?Iya! Lihatlah arahan "copytruncate" yang ditawarkan oleh logrotate. Menentukan bahwa menginstruksikan logrotate untuk menangani situasi ini: sebuah program sederhana yang membuat file log-nya terbuka tanpa batas.
Satu peringatan mungkin atau mungkin tidak menjadi masalah dalam situasi Anda:
Secara anekdot, saya telah melihat beberapa sumber log "dunia nyata" yang mendorong pengguna untuk menerapkan arahan ini. Ada beberapa diskusi tentang opsi ini di sini .
sumber
Gunakan split, itu bagian dari coreutils. Ia dapat mengambil stdin dan membaginya menjadi potongan-potongan (berdasarkan ukuran potongan, atau jumlah garis, dll.).
Contoh:
Note dash (-) memerintahkan "split" untuk menggunakan stdin alih-alih file.
sumber
split
memiliki data dalam apa yang bisa menjadi buffer besar. Mengingat bahwa ada beberapa alat yang menyelesaikan masalah ini dengan benar, saya tidak berpikir solusi roll-your-own semacam ini dapat direkomendasikan.Saya suka
multilog
untuk use case saya, tetapi use case saya sangat sepele / sederhana sehingga tidak ditata dengan sangat sederhana dalam dokumen / contoh yang saya temukan. Berikut ini adalah contoh rotate multilog sederhana:Beberapa catatan:
"Note that running processor may block any program feeding input to multilog."
mana 'prosesor' adalah'!tai64nlocal'
bagian dari perintah* Untuk banyak aplikasi, ini adalah pilihan yang buruk untuk penggunaan jangka panjang. Mereka memungkinkan Anda untuk mengamati perilaku mengisi dan memutar log lebih cepat daripada log besar.
Akhirnya, jangan lupa nohup jika diminta! Dengan nohup, Anda tidak perlu
2>&1
(s = 10e6 dan n = 30 di sini):Perintah itu harus membantu Anda memulai.
sumber
Saya hanya ingin menambahkan komentar Sam Hendley di atas:
Kuncinya adalah ini hanya berfungsi jika pengalihan dilakukan dengan
>>
(append) bukan>
(buat).Saya mengalami masalah yang sama di mana file asli terus tumbuh jika Anda menggunakan
>
(buat) tetapi jika Anda menggunakan>>
(menambahkan) Logrotate copytruncate berfungsi dengan baik dan seperti yang diharapkan. File asli kembali ke nol byte dan program terus menulis.Redirect STDOUT dan STDERR ke file log berputar:
some-program.sh >> /tmp/output.txt 2>&1 &
Buat file konfigurasi logrotate dengan
/etc/logrotate.d
nama apa pun, output_roll dalam kasus saya.Contoh konfigurasi untuk kasus saya:
Atur pekerjaan cron Anda di dalam
/etc/crontab
fileIni akan memeriksa file setiap menit. Anda dapat menyesuaikan sesuai dengan kebutuhan Anda.
Mulai itu:
Itu dia
Catatan: Saya juga punya masalah dengan SELinux yang diatur
SELINUX=enforcing
jadi saya aturSELINUX=disabled
.sumber
Saya menulis logrotee akhir pekan ini. Saya mungkin tidak akan melakukannya jika saya sudah membaca jawaban JdeBP dan
multilog
.Saya fokus pada itu menjadi ringan dan mampu bzip2 potongan outputnya seperti:
Masih banyak yang harus dilakukan dan diuji.
sumber