¿Cómo forzar a Logstash a analizar un archivo?

91

Instalé Logstash para analizar archivos apache. Me tomó bastante tiempo conseguir la configuración correcta y siempre probé registros reales. Noté (como dice la documentación) que logstash "recuerda" dónde estaba en un archivo. Ahora mis configuraciones están bien y me gustaría que Logstash se "olvidara". Esto parece más difícil de lo que pensé. Ya hice lo siguiente:

  • usado: start_position => "beginning"

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

  • miró con qué archivos abrió logstash lsof -p PIDy eliminó todo lo que prometía (en mi caso /tmp/jffi*.tmp)

Aún así, Logstash no olvida y analiza solo los archivos "nuevos" en la carpeta donde están los registros

¿Algunas ideas?

Christophe Claude
fuente
Última versión de logstash que encontré en:/opt/logstash/data/plugins/inputs/file
Tim Smith

Respuestas:

135

Por defecto, logstash escribe la última posición 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/nullcomo sincedb_path.

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

Dónde escribir la base de datos desde (realiza un seguimiento de la posición actual de los archivos de registro monitoreados). Por defecto, el valor de 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"
    }
}
flazzarini
fuente
28
En Windows puede utilizar sincedb_path => "NUL"para obtener el mismo efecto. Detalles aquí
Chris Magnuson
11
Si los archivos son bastante antiguos (más de 24 horas), es muy útil agregar una opción ingnore_older => 0para que logstash los tome sin importar la fecha. De forma predeterminada, si los archivos son anteriores, se ignorarán las 24 horas.
mtfk
1
@mtfk: ¡Increíble hallazgo! ¡Gracias por señalar ignore_older => 0trabajos en logstash! Me ha atascado el mismo problema que el interrogador. ¡Parece ser un hallazgo no obvio! (Al buscar en Google "ignore_older" y "logstash" solo aparecen páginas en filebeat, no pude encontrar ningún rastro de cómo lidiar con esto en logstash)
Mike Lutz
Cómo agregar esto mientras se usa filebeat
Sunilkumar Ramamurthy
@SunilkumarRamamurthy Creo que si se omite la opción ignore_olderen la configuración de filebeat, filbeat se ve obligado a leer todo el archivo de nuevo elastic.co/guide/en/beats/filebeat/current/...
flazzarini
19

El historial de almacenamiento de archivos del complemento de "cola" en el archivo sincedb, predeterminado: en $ HOME / .sincedb *, consulte http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

El archivo since db contiene una línea similar a la siguiente:

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

Entonces, si desea analizar nuevamente un archivo completo, debe:

  • eliminar archivos sindedb
  • O solo elimine 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 reinicia Logstash

Con la clave start_position => "beginning", Logstash analizará todo el archivo.

Ejemplo de un archivo sincedb:

si no
fuente
1
Al respecto start_position => "beginning", la documentación dice:> Esta opción solo modifica situaciones de "primer contacto" donde un archivo es nuevo y no se ha visto antes. Si un archivo ya se ha visto antes, esta opción no tiene ningún efecto.
Brad
10

Logstash mantendrá el registro en formato $HOME/.sincedb_*. Puede eliminar todo .sincedby reiniciar logstash, Logstash analizará el archivo.

Ben Lim
fuente
9

Combinando todas las respuestas, supongo que esta es la mejor manera de analizar archivos. Hice lo mismo para mis pruebas.

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_logcambiar la marca de tiempo del archivo.

vikas027
fuente
tenga en cuenta que agregar la configuración ignore_older => 0hará lo contrario.
panchicore
5

Si está utilizando logstash-forwarder, busque el .logstash-forwarderarchivo en su hogar :

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
elwarren
fuente
3
Si está instalado como un paquete, verifique /var/lib/logstash-forwarder/.
Wesley Baugh
3

Después de eliminarlo $HOME/.sincedb_*, todavía no estaba ingiriendo datos para mí.

Después de probar un montón de cosas , eliminé todo menos el .confarchivo principal /etc/logstash/conf.dy reinicié Logstash, y todo funcionó. Solo puedo asumir que había algo en uno de los .confarchivos que logstash estaba colgando silenciosamente.

Seth
fuente
Según recuerdo, más tarde encendí una bandera de depuración y me dijo por qué estaba enojado en lugar de colgar silenciosamente. Creo que buscaba un número de versión en los datos, pero a veces los datos no tenían un número. La verificación para averiguar cuál era el número fallaría si no fuera un número, así que primero tuve que probar si era un número y luego preguntar qué número era.
Set
1

En realidad, volver a analizar cada vez es muy costoso si el archivo contiene muchos datos. Así que debes tener cuidado antes de hacer esto. Si queremos forzarlo a analizar nuevamente, establezca el parámetro dentro del bloque de entrada

sincedb_path => "/dev/null" 

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

sincedb_path => "/home/shubham/sinceDB/productsSince.db"
Shubham Gupta
fuente
1

Si desea evitar jugar con las opciones de logstash, descubrí que cambiar el nombre o eliminar el archivo de registro existente y crear un nuevo archivo a partir del contenido del archivo anterior engañará a logstash para que vuelva a indexarlo.

GreensterRox
fuente
0

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 agregando

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

a mi complemento de archivo. Creo que para restablecer cada vez, solo cambie la ruta de sincedb_path

Joseph
fuente
0

si usa tar.gz install filebeat, puede eliminar este archivo $FilebeatPath/data/registry/filebeat/data.json, y volver a ejecutar el filebeat

LT
fuente
0

Pruebe eliminando la /var/lib/logstashcarpeta en su ENV

Rajitha Abeysekara
fuente
-1

El nuevo directorio de logstash versión 5 está en

<path.data>/plugins/inputs/file

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

foo01
fuente