Saya sedang bekerja di Ubuntu 14 dengan utilitas rsyslog dan logrotate default.
Dalam /etc/logrotate.d/rsyslog
konfigurasi 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?
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.
sumber
Ini sepenuhnya tergantung pada bagaimana proses menulis log.
copytruncate
hanya berfungsi, jika pesan log ditambahkan ke file (miswhatever >> logfile
.Dan tidak ketika itu mengarahkan output (misalnya
whatever > logfile
).sumber
Sejak versi 8.16 rsyslog memiliki opsi imfile
reopenOnTruncate
yang menangani masalah copytruncte.sumber
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
reload
pendekatan ini membutuhkan lebih sedikit penyimpangan dari konfigurasi default, saya akan menyimpannya.sumber