una txt texto open linea leer importar especifica ejercicios datos como columnas archivos archivo python logging rotation

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.