¿Cómo forzar a Logstash a volver a rastrear un archivo?

Instalé Logstash para analizar los archivos de Apache. Me tomó bastante tiempo obtener las configuraciones correctas y siempre probé los registros reales. Noté (como dice la documentación) que Logstash “recuerda” dónde estaba en un archivo. Ahora mis selecciones son correctas y me gustaría que Logstash “olvide”. Esto parece más difícil de lo que pensé. Ya hice lo siguiente:

  • used: start_position => "beginning"

  • eliminó la carpeta completa de “datos” de elastissearch (y la detuvo primero)

  • Miré los archivos abiertos por logstash con lsof -p PID y eliminé todo lo que era prometedor (en mi caso /tmp/jffi*.tmp )

Still Logstash no olvida y analiza solo los archivos “nuevos” en la carpeta donde están los registros

¿Algunas ideas?

De forma predeterminada, logstash escribe que la última posición estaba en un archivo de registro que generalmente reside en $HOME/.sincedb . Se puede engañar a Logstash haciéndole creer que nunca analizó el archivo de registro especificando /dev/null como sincedb_path .

Aquí la parte de la documentación Archivo de entrada .

Dónde escribir la base de datos desde (realiza un seguimiento de la posición actual de los archivos de registro supervisados). El valor predeterminado es la variable de entorno “$ SINCEDB_PATH” o “$ HOME / .sincedb”.

Ejemplo de configuración

 input { file { path => "/tmp/logfile_to_analyse" start_position => "beginning" sincedb_path => "/dev/null" } } 

El historial de la tienda de archivos del complemento de “rastreo” en el archivo sincedb, predeterminado: en $ HOME / .sincedb *, consulte http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

El archivo desde que el archivo db contiene línea se ve así:

 [inode] [major device number] [minor device number] [byte offset] 

Por lo tanto, si desea analizar de nuevo un archivo completo, debe:

  • eliminar archivos sindedb
  • O solo borre la línea correspondiente en el archivo sincedb, verifique el número de inodo antes de su archivo ( ls -i yourFile | awk '{print $1}' )
  • Y reinicie Logstash

Con la tecla start_position => “comenzando, Logstash analizará todo el archivo.

Ejemplo de un archivo sincedb:

Logstash mantendrá el registro en $ HOME / .sincedb_ *. Puede eliminar todos los archivos .sincedb y reiniciar logstash, Logstash volverá a rastrear el archivo.

Combinando todas las respuestas, adivina que esta es la mejor manera de analizar archivos. Hice lo mismo para mi prueba.

 input { file { path => "/tmp/access_log" start_position => beginning sincedb_path => "/dev/null" ignore_older => 0 } } 

Para una prueba rápida, en lugar de ignore_older , también puede touch /tmp/access_log para cambiar la marca de tiempo del archivo.

Si está utilizando logstash-forwarder, busque en su casa el archivo .logstash-forwarder :

 { "/var/log/messages": { "source": "/var/log/messages", "offset": 43715, "inode": 12967, "device": 51776 } } 

Después de eliminar $ HOME / .sincedb_ * aún no estaba ingiriendo datos para mí.

Después de probar un montón de cosas, eliminé todo menos el archivo .conf principal de /etc/logstash/conf.d y reinicié Logstash, y todo funcionó. Solo puedo suponer que había algo en uno de los archivos .conf que Logstash colgaba silenciosamente.

En realidad, el repaso de cada vez es muy costoso si el archivo tiene grandes datos. Entonces debes tener cuidado antes de hacer esto. Si queremos obligarlo a volver a analizar, configure el parámetro dentro del bloque de entrada

 sincedb_path => "/dev/null" 

Esta opción no almacenará el archivo .sincedb y logstash volverá a analizar cada vez. Pero si desea volver a rastrear ocasionalmente no cada vez, entonces lo que puede hacer es eliminar manualmente la ruta .sinceDb que se crea al analizar el archivo. En general, está presente en el directorio de inicio como un archivo oculto si no es un usuario root, sino en el directorio raíz. También puede establecer sincedb_path en alguna otra ubicación para rastrear este archivo fácilmente.

 sincedb_path => "/home/shubham/sinceDB/productsSince.db" 

Si quiere evitar jugar con las opciones de logstash, he encontrado que renombrar o eliminar el archivo de registro existente y crear un nuevo archivo a partir del contenido anterior del archivo engañará a Logstash para que vuelva a indexarlo.

Lo encontré en mi directorio de inicio, pero después de eliminarlo, Logstash se negó a volver a seleccionar los archivos de registro existentes. La forma en que lo hice funcionar fue agregar

 sincedb_path => "/opt/elk/sincedb/" 

a mi plugin de archivos Creo que para restablecer cada vez, simplemente cambie la ruta de sencedb_path

Logstash versión 5 nuevo directorio está en

 /plugins/inputs/file 

La definición de path.data está en logstash.yml