Estoy trabajando en Ubuntu 14 con la utilidad predeterminada rsyslog y logrotate.
En la configuración predeterminada de rsyslog logrotate /etc/logrotate.d/rsyslog
veo lo siguiente:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Por lo que entiendo, se recomienda usar copytruncate en todos los escenarios de logrotate, ya que no mueve el registro actual, sino que trunca el registro para que cualquier proceso con un controlador de archivo abierto pueda seguir escribiendo en él.
Entonces, ¿cómo es que la configuración predeterminada utiliza la función de recarga rsyslog en su lugar?
Hablando como autor de rsyslog, copytruncate es en realidad una muy, muy, muy mala elección. Es intrínsecamente picante y su uso es casi una garantía de que perderá datos de registro. Cuanto más frecuentemente se escriba en el archivo, más perderá. Y esto no es solo parte de la última línea, sino que puede ser varios cientos, dependiendo de la sincronización exacta y el estado del sistema en el momento en que ocurre la rotación.
Cuando se mueve el archivo y se crea un nuevo inodo (archivo), rsyslog realiza un seguimiento del archivo anterior y completa el procesamiento. Entonces no tienes ninguna pérdida en este caso. Garantizado (excepto si desmonta el sistema de archivos ...).
En "reopenOnTruncate": Personalmente, he visto que reopenOnTruncate también es picante en otros aspectos, especialmente con NFS y similares. Hace algún tiempo, eliminé totalmente esa funcionalidad, pero luego fui persuadido para que volviera a fusionar una funcionalidad similar. Se mantendrá "experimental" probablemente para siempre, ya que realmente sé que la gente tiene problemas en sistemas muy cargados. "copytruncate" simplemente no es un modo decente para trabajar con archivos de registro.
Actualmente trabajo en la refactorización de archivos (ETA 8.34 o 8.35). La versión refactorizada probablemente podrá evitar el reenvío accidental debido a la carrera API, pero tampoco puede proteger contra la pérdida de datos, porque esto es conceptualmente imposible.
fuente
Esto depende completamente de cómo el proceso está escribiendo registros.
copytruncate
solo funciona si los mensajes de registro se agregan al archivo (pwhatever >> logfile
. ej .,y no cuando se redirige la salida (p
whatever > logfile
. ej .).fuente
Desde la versión 8.16, rsyslog tiene una opción de archivo
reopenOnTruncate
que maneja el problema de copytruncte.fuente
Para rsyslog específicamente, probablemente tenga más sentido dejar las cosas como están.
La razón básica es que rsyslog tiene colas internas que puede usar en casos donde su manejador de salida no está disponible.
La recarga a) hará que rsyslog vuelva a crear su propio archivo de registro, yb) hará que los eventos en cola se vacíen al archivo en la creación.
Puede ser que el copytruncate no dañe (aunque me preocuparía que las líneas parcialmente escritas se truncaran), pero tendería a pensar que copiar / eliminar / recargar es 'más seguro' desde un punto de vista de integridad.
Como mencionó @ faker , dado que rsyslog puede manejar la situación en la que su archivo no está disponible, no hay una razón convincente para usar copytruncate.
Y como mencionó @ SelivanovPavel , rsyslog en realidad requiere una configuración específica para manejar la copia truncada correctamente.
Entonces, si solo porque usar el
reload
enfoque requiere menos desviación de la configuración predeterminada, lo mantendría.fuente