txt - leer columnas en python
python WatchedFileHandler sigue escribiendo en un archivo anterior después de la rotación (2)
Utilice la opción copytruncate
de logrotate. De los documentos
copiado
Trunca el archivo de registro original en su lugar después de crear una copia, en lugar de mover el archivo de registro anterior y opcionalmente crear uno nuevo. Se puede usar cuando no se le puede decir a algún programa que cierre su archivo de registro y así continuar escribiendo (añadiendo) el archivo de registro anterior para siempre. Tenga en cuenta que hay un segmento de tiempo muy pequeño entre copiar el archivo y truncarlo, por lo que algunos datos de registro pueden perderse. Cuando se usa esta opción, la opción de crear no tendrá ningún efecto, ya que el archivo de registro anterior permanece en su lugar.
He estado usando WatchedFileHandler como mi manejador de archivos de inicio de sesión de python, para poder rotar mis registros con logrotate
(en ubuntu 14.04), que sabes que es para lo que los documentos dicen que es. Mis archivos de configuración de logrotate
se parecen
/path_to_logs/*.log {
daily
rotate 365
size 10M
compress
delaycompress
missingok
notifempty
su root root
}
Todo parecía funcionar bien. Estoy usando logstash para enviar mis registros a mi cluster elasticsearch y todo es genial. Agregué un segundo archivo de registro para mis registros de depuración que se gira pero no es visto por Logstash. Noté que cuando ese archivo se gira, Python simplemente sigue escribiendo en /path_to_debug_logs/*.log.1
y nunca comienza a escribir en el nuevo archivo. Si selecciono manualmente /path_to_debug_logs/*.log.1
, cambia instantáneamente y comienza a escribir en /path_to_debug_logs/*.log
.
Esto me parece REALMENTE extraño.
Creo que lo que está sucediendo es que logstash siempre está siguiendo mis registros que no son de depuración, lo que de alguna manera desencadena el cambio al nuevo archivo después de llamar a logrotate
. Si se llama dos veces a logrotate
sin un cambio, el archivo log.1 se mueve y se comprime a log.2.gz, que python ya no puede iniciar sesión y los registros se pierden.
Claramente hay un montón de soluciones hacky para esto (como un cronjob que intercepta todos mis registros de vez en cuando), pero siento que debo estar haciendo algo mal.
Estoy usando WatchedFileHandler
y logrotate
lugar de RotatingFileHandler
por varias razones, pero principalmente porque comprime mis registros de forma agradable después de la rotación.
ACTUALIZAR:
Probé el horrible truco de agregar una cola manual al final de mi script de configuración de rotación de registro.
sharedscripts
postrotate
/usr/bin/tail -n 1 path_to_logs/*.log.1
endscript
Efectivamente, esto funciona la mayor parte del tiempo, pero al azar falla a veces sin una razón clara, por lo que no es una solución. También he probado varias soluciones menos hacky donde he modificado la forma en que WatchFileHandler
comprueba si el archivo ha cambiado, pero no WatchFileHandler
suerte.
Estoy bastante seguro de que la raíz de mi problema es que los registros se almacenan en una unidad de red, lo que de alguna manera confunde el sistema de archivos.
Estoy moviendo mi rotación a Python con RotatingFileHandler
, pero si alguien conoce la forma correcta de manejar esto, me gustaría saberlo.
WatchedFileHandler
realiza una renovación cuando se detecta un cambio de dispositivo y / o inodo en el archivo de registro justo antes de escribir en él. ¿Quizás el archivo que no está siendo visto por logstash
no ve un cambio en su dispositivo / inode? Eso explicaría por qué el controlador sigue escribiendo sobre eso.