¿Cómo manejar múltiples entradas heterogéneas con Logstash?

95

Supongamos que tiene 2 tipos de registros muy diferentes, como registros técnicos y comerciales, y desea:

  • Los registros técnicos sin procesar se enrutarán hacia un servidor graylog2 mediante una gelfsalida,
  • json los registros comerciales se almacenan en un clúster de elasticsearch utilizando la elasticsearch_httpsalida dedicada .

Sé que, Syslog-NGpor ejemplo, el archivo de configuración permite definir varias entradas distintas que luego se pueden procesar por separado antes de ser despachadas; lo que Logstashparece incapaz de hacer. Incluso si una instancia se puede iniciar con dos archivos de configuración específicos, todos los registros toman el mismo canal y se aplican los mismos procesamientos ...

¿Debo ejecutar tantas instancias como diferentes tipos de registros?

David
fuente
2
¡Deberías aceptar la respuesta correcta de Ben Lim!
Ben Wheeler

Respuestas:

191

¿Debo ejecutar tantas instancias como diferentes tipos de registros?

¡No! Solo puede ejecutar una instancia para manejar diferentes tipos de registros.

En el archivo de configuración de logstash, puede especificar cada entrada con un tipo diferente . Luego, en el filtro puede usar if para distinguir diferentes procesamientos, y también en la salida puede usar la salida "if" a un destino diferente.

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

Espero que esto le pueda ayudar :)

Ben Lim
fuente
1
También puede usar el typeatributo (con la misma type => "value"sintaxis) en el filtro y las definiciones de salida, lo que debería reducir un poco el formato adicional dentro del archivo de configuración. Ejemplo: gist.github.com/fairchild/3030472 Por documentación: agregue un campo 'tipo' a todos los eventos manejados por esta entrada. Los tipos se utilizan principalmente para la activación de filtros. El tipo se almacena como parte del evento en sí, por lo que también puede usar el tipo para buscarlo en la interfaz web.
Tony Cesaro
5
Bueno, parece que lo que Ben proporcionó es en realidad la nueva forma de hacer esto. Cuando utilicé type => "value"en una salida, apareció el siguiente mensaje: "Estás usando una configuración de configuración obsoleta" tipo "establecida en stdout. Las configuraciones obsoletas continuarán funcionando, pero están programadas para su eliminación de logstash en el futuro. Puedes lograr este mismo comportamiento con los nuevos condicionales, como: if [type] == "sometype" { stdout { ... } }". Me retracto de mi comentario anterior. :)
Tony Cesaro
Tenga en cuenta que el typeatributo no se aplicará si ya existe un campo de tipo de la entrada. Este es un atributo especial que no se anula y está documentado. Abrí un ticket en Elastic y me recomendaron usar tagso en add_fieldlugar detype
BornToCode
@BornToCode, no lo entiendo del todo. ¿Estás diciendo que hay algún problema con el código de Ben? ¿O que no funcionaría si las rutas de registro fueran el mismo archivo? ¿Cuál es el escenario en el que no funciona?
Ben Wheeler
2
@BenLim El OP no aceptó tu respuesta, pero la encontré de lo más útil y te voté.
bigbadmouse
15

Usé etiquetas para la entrada de múltiples archivos:

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}
Robin Wang
fuente
Esto es mejor que la respuesta aceptada: permite múltiples entradas de filebeat en logstash. En tales casos, la propiedad "type" se establece en "log" y no se puede modificar.
Régis B.
¿Pero no se sobrescriben las etiquetas con la última etiqueta (bbb)? Y nuevamente, en el estado if, si las etiquetas fueran una matriz o una sola cadena, ambos IF funcionarían. Entonces, lógicamente, esto es incorrecto, pero tal vez logstash tenga una lógica diferente dentro de if's
meso_2600
0

Creo que logstash no puede leer más de 2 archivos en la sección de entrada. prueba lo siguiente

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
fuente
Sí, me encuentro con el mismo 'problema'
meso_2600