Red de conocimiento informático - Aprendizaje de programación - Logstash no puede leer el contenido actualizado del archivo

Logstash no puede leer el contenido actualizado del archivo

Recientemente, he estado construyendo una plataforma de datos usando ELK y he estado usando Logstash (en adelante, LS) para leer el contenido del archivo y sincronizarlo con ES. El contenido del archivo se genera mediante una secuencia de comandos de Python y el nombre del archivo permanece sin cambios. Es decir, la secuencia de comandos de Python sobrescribirá el mismo archivo cada vez. El proceso de demostración es el siguiente:

demostración de Python. .py

Demostración de Logstash t.conf

¡El resultado es súper extraño! LS no leerá el contenido del archivo, solo leerá los datos cuando vim el archivo manualmente.

Al principio, pensé que la configuración de parámetros del complemento de entrada de archivos era incorrecta. Luego busqué en la comunidad oficial y lo encontré en https://discuss.elastic.co/t/file-plugin. -no-lee-archivo Encontré esta pregunta en /49052/3, el interlocutor tuvo exactamente el mismo problema que yo. La pregunta del interlocutor es exactamente la misma que la mía. Alguien respondió a continuación que el problema fue causado por el parámetro ignore_older. Luego el interlocutor cambió el valor del parámetro ignore_older y el problema se resolvió. Pensé que había encontrado la respuesta, así que verifiqué la definición del parámetro ignore_older, que se extrae a continuación:

En el sitio web https://discuss.elastic.co/t/logstash-sincedb-files/ 95297/2, detalla que cada parámetro de ruta en el archivo .conf corresponde a 1 ruta base de cifrado. Si hay comodines en la ruta, como "/Applications/logstash-5.6.3/test .json", Logstash colocará la información relacionada con la lectura del archivo .json de prueba en un archivo sincedb unificado en lugar de uno para cada archivo sincedb. archivo.

Además, este enlace también presenta las reglas para que LS lea archivos, que se explicarán en detalle más adelante. Echemos un vistazo al contenido del archivo sincedb:

Una fila de datos en el archivo contiene cuatro números, que representan el número de inodo, el número de dispositivo principal, el número de dispositivo menor y el desplazamiento de bytes actual.

Donde, inodo, dispositivo mayor, dispositivo menor y desplazamiento de bytes actual son el número de inodo, el número de dispositivo mayor y el número de dispositivo menor, respectivamente. Los dispositivos y los dispositivos secundarios son conceptos de sistema de archivos del sistema operativo. El desplazamiento de bytes actual representa la posición donde se leyó el archivo por última vez.

Logstash no leerá el archivo en el problema del inodo. Para entenderlo simplemente, el inodo registra los atributos del archivo, como el número de bytes del archivo, ID de usuario, ID de grupo, permisos de lectura y escritura, etc. Un archivo corresponde a un inodo.

El enlace anterior describe la relación entre los archivos de lectura de LS y el inodo del archivo:

En otras palabras, cuando se gira el archivo, el inodo del archivo no cambia. Es:

Entonces, cuando pruebo la demostración de Py localmente, el inodo del archivo no cambia cada vez que paso a él. Entonces, cuando pruebo la demostración de Py localmente, cada vez que sobrescribo el mismo archivo con el mismo contenido, el tamaño del archivo no cambia, por lo que LS no lee el contenido del archivo. LS puede leer los datos siempre que cada actualización del archivo haga que el tamaño del archivo cambie, pero eso tampoco se adapta a mis necesidades. Después de todo, escribiré algo completamente nuevo cada vez, y el contenido recién escrito puede ser exactamente el mismo que la última vez (este es un requisito comercial), por lo que LS no leerá los datos. Además, incluso si el contenido no es exactamente el mismo, si el nuevo contenido es mayor que el desplazamiento, el contenido leído por LS no estará completo (porque comenzará a leer desde el desplazamiento anterior y el contenido anterior se ignorará). ).

Entonces sigue este enlace https://discuss.elastic.co/t/logstash-is-not-reading-the-log-file-thats-being-updated-automatically-continufully/ 92686/7 Puede ver el mecanismo de relectura de archivos en:

Una situación es que el inodo del archivo cambia, es decir, se crea un nuevo archivo y la otra situación es que el archivo se rota, como se mencionó anteriormente; .

Por lo tanto, esto se puede hacer escribiendo un nuevo archivo (usando un nuevo inodo) cada vez usando comodines en .conf:

De esta manera, sincedb agregará la nueva línea para registrar el contenido del nuevo inodo y Logstash leerá el contenido del nuevo archivo en su totalidad.

Esto también explica por qué tengo que editar manualmente el archivo para que Logstash lo lea, porque cada vez que se edita el archivo, el inodo del archivo cambia.

Pruébelo:

En Mac, el inodo del archivo fuente es 13326659, luego vim edita el archivo (cambia 1 número al azar) y luego guarda:

Entonces el inodo del archivo se convierte en 13334123, que es un archivo nuevo para LS y se leerá todo el contenido. En cuanto a por qué vim cambia el número de inodo del archivo:

El mecanismo para que vim modifique el archivo es cambiar el nombre del archivo, luego crear un nuevo archivo con el mismo nombre que el archivo fuente y luego escribir el contenido del archivo original al nuevo archivo.

Aunque el contenido escrito en la prueba local es el mismo cada vez, se necesita un gran círculo en el camino para resolver el problema, pero también aprendí sobre el mecanismo de lectura de archivos de LS a través de este gran círculo. lo cual es mejor que estar confundido. Es mejor usar mucho de manera confusa, y en el proceso de comprender el inodo y la rotación, las ganancias no son pequeñas ~.