rsyslog dengan logrotate: reload rsyslog vs copytruncate

16

Saya sedang bekerja di Ubuntu 14 dengan utilitas rsyslog dan logrotate default.

Dalam /etc/logrotate.d/rsyslogkonfigurasi default rsyslog logrotate saya melihat yang berikut:

/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}

Dari apa yang saya pahami, disarankan untuk menggunakan copytruncate di semua skenario logrotate, karena itu tidak memindahkan log saat ini, tetapi lebih memotong log sehingga setiap proses dengan penangan file terbuka akan dapat tetap menulis untuk itu.

Jadi bagaimana konfigurasi default menggunakan fitur reload rsyslog?

Mattan
sumber

Jawaban:

28

Untuk menjawab pertanyaan Anda, Anda harus terlebih dahulu memahami perbedaan trade-off dari reload dan copytruncate:

  • reload : file log lama diubah namanya dan proses penulisan ke dalam log itu diberitahukan (melalui sinyal Unix) untuk membuat kembali file lognya. Ini adalah metode overhead tercepat / rendah: operasi penggantian nama / pemindahan sangat cepat dan memiliki waktu eksekusi yang konstan. Selain itu, ini adalah operasi yang hampir atomik: ini berarti bahwa (hampir) tidak ada entri log akan hilang selama pemindahan / pemuatan ulang. Di sisi lain, Anda memerlukan proses yang dapat memuat ulang dan membuka kembali file log-nya. Rsyslog adalah proses semacam itu, jadi konfigurasi default logrotate menggunakan metode reload. Menggunakan mode ini dengan rsyslog sangat disarankan oleh rsyslog hulu.
  • copytruncate : file log lama disalin ke file arsip, dan kemudian dipotong untuk "menghapus" baris log lama. Sementara operasi pemotongan sangat cepat, salinannya bisa cukup lama (tergantung seberapa besar file log Anda). Selain itu, beberapa entri log dapat hilang selama waktu antara operasi penyalinan (ingat, ini bisa lambat) dan truncate. Untuk alasan ini, copytruncate tidak digunakan secara default untuk layanan yang dapat memuat ulang dan membuat ulang file log mereka. Di sisi lain, jika server tidak mampu memuat ulang / membuat ulang file log, copytruncate adalah taruhan Anda yang paling aman. Dengan kata lain, itu tidak memerlukan dukungan tingkat layanan. Proyek upstream rsyslog sangat menyarankan agar tidak menggunakan mode ini.
shodanshok
sumber
Saya membatasi file log saya masing-masing hingga 500 juta, jadi menyalinnya tidak akan menjadi masalah (paling lama beberapa detik). Terima kasih!
Mattan
15

Berbicara sebagai penulis rsyslog, copytruncate sebenarnya adalah pilihan yang sangat, sangat, sangat buruk. Secara inheren bersemangat dan menggunakannya hampir merupakan jaminan bahwa Anda akan kehilangan data log. Semakin sering file ditulis, semakin banyak Anda akan kehilangan. Dan ini bukan hanya bagian dari baris terakhir, tetapi bisa beberapa ratus, tergantung pada waktu yang tepat dan keadaan sistem pada saat rotasi terjadi.

Ketika file dipindahkan dan inode (file) baru dibuat, rsyslog melacak file sebelumnya dan menyelesaikan pemrosesan. Jadi Anda tidak mengalami kerugian dalam hal ini. Dijamin (kecuali jika Anda melepas sistem file ...).

Pada "reopenOnTruncate": Saya pribadi telah melihat reopenOnTruncate menjadi bersemangat dalam hal lain juga, terutama dengan NFS dan sejenisnya. Beberapa waktu yang lalu saya benar-benar menghapus fungsionalitas itu, tetapi kemudian dibujuk untuk menggabungkan fungsionalitas yang sama kembali. Ini akan tetap "eksperimental" kemungkinan besar selamanya, karena saya benar-benar tahu orang-orang mengalami masalah pada sistem yang sangat sarat muatan. "copytruncate" sama sekali bukan mode yang layak untuk bekerja dengan file log.

Saat ini saya sedang mengerjakan refactoring imfile (ETA 8.34 atau 8.35). Versi refactored mungkin akan dapat mencegah pengiriman ulang yang tidak disengaja karena ras API, tetapi juga tidak dapat menjaga terhadap kehilangan data - karena ini secara konsep tidak mungkin.

Rainer Gerhards
sumber
1

Ini sepenuhnya tergantung pada bagaimana proses menulis log.
copytruncatehanya berfungsi, jika pesan log ditambahkan ke file (mis whatever >> logfile.
Dan tidak ketika itu mengarahkan output (misalnya whatever > logfile).

pemalsu
sumber
1

Sejak versi 8.16 rsyslog memiliki opsi imfile reopenOnTruncateyang menangani masalah copytruncte.

Selivanov Pavel
sumber
0

Khususnya untuk rsyslog, mungkin lebih masuk akal untuk membiarkan segala sesuatu apa adanya.

Alasan dasarnya adalah rsyslog memiliki antrian internal yang dapat digunakan dalam kasus-kasus di mana pegangan keluarannya menjadi tidak tersedia.

Reload akan a) menyebabkan rsyslog untuk membuat kembali file log-nya sendiri, dan b) menyebabkan setiap peristiwa yang antri mem-flush ke file pada saat pembuatan.

Mungkin copytruncate tidak ada salahnya (walaupun saya akan khawatir tentang baris yang ditulis sebagian dipotong), tetapi saya cenderung berpikir bahwa copy / delete / reload 'lebih aman' dari sudut pandang integritas.

Seperti yang disebutkan oleh @ faker , karena rsyslog dapat menangani situasi di mana file menjadi tidak tersedia, tidak ada alasan kuat untuk menggunakan copytruncate.

Dan seperti yang disebutkan oleh @ SelivanovPavel , rsyslog sebenarnya membutuhkan konfigurasi khusus untuk menangani copy truncate dengan benar.

Jadi jika hanya karena menggunakan reloadpendekatan ini membutuhkan lebih sedikit penyimpangan dari konfigurasi default, saya akan menyimpannya.

iwaseatenbyagrue
sumber