Comment gérer plusieurs entrées hétérogènes avec Logstash?

95

Disons que vous avez 2 types de journaux très différents tels que les journaux techniques et commerciaux et que vous voulez:

  • les journaux techniques bruts soient acheminés vers un serveur graylog2 à l'aide d'une gelfsortie,
  • json business logs être stockés dans un cluster elasticsearch à l'aide de la elasticsearch_httpsortie dédiée .

Je sais qu'avec Syslog-NGpar exemple, le fichier de configuration permet de définir plusieurs entrées distinctes qui peuvent ensuite être traitées séparément avant d'être expédiées; ce qui Logstashsemble incapable de faire. Même si une instance peut être lancée avec deux fichiers de configuration spécifiques, tous les journaux empruntent le même canal et sont appliqués les mêmes traitements ...

Dois-je exécuter autant d'instances que j'ai différents types de journaux?

David
la source
2
Vous devriez accepter la bonne réponse de Ben Lim!
Ben Wheeler

Réponses:

191

Dois-je exécuter autant d'instances que j'ai différents types de journaux?

Non! Vous ne pouvez exécuter qu'une seule instance pour gérer différents types de journaux.

Dans le fichier de configuration de logstash, vous pouvez spécifier chaque entrée avec un type différent . Ensuite, dans le filtre, vous pouvez utiliser if pour distinguer différents traitements, et également à la sortie, vous pouvez utiliser la sortie "if" vers une destination différente.

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
    }
}

J'espère que cela peut vous aider :)

Ben Lim
la source
1
Vous pouvez également utiliser l' typeattribut (avec la même type => "value"syntaxe) dans les définitions de filtre et de sortie, ce qui devrait réduire un peu le formatage supplémentaire dans le fichier de configuration. Exemple: gist.github.com/fairchild/3030472 Par documentation: Ajoutez un champ 'type' à tous les événements gérés par cette entrée. Les types sont principalement utilisés pour l'activation des filtres. Le type est stocké dans le cadre de l'événement lui-même, vous pouvez donc également utiliser le type pour le rechercher dans l'interface Web.
Tony Cesaro
5
Eh bien, il semble que ce que Ben a fourni est en fait la nouvelle façon de le faire. Lorsque j'ai utilisé type => "value"dans une sortie, le message suivant s'affiche: "Vous utilisez un paramètre de configuration obsolète" type "défini dans stdout. Les paramètres obsolètes continueront de fonctionner, mais leur suppression de logstash est prévue à l'avenir. Vous pouvez obtenir ce même comportement avec les nouvelles conditions, comme:. if [type] == "sometype" { stdout { ... } }" Je retire mon commentaire précédent. :)
Tony Cesaro
Notez que l' typeattribut ne s'appliquera pas s'il existe déjà un champ de type à partir de l'entrée. C'est un attribut spécial qui ne remplace pas et qui est documenté. J'ai ouvert un ticket dans Elastic et ils m'ont recommandé d'utiliser tagsou à la add_fieldplace detype
BornToCode
@BornToCode, je ne comprends pas très bien. Êtes-vous en train de dire qu'il y a un problème avec le code de Ben? Ou que cela ne fonctionnerait pas si les chemins du journal étaient le même fichier? Quel est le scénario où cela ne fonctionne pas?
Ben Wheeler
2
@BenLim Le PO n'a pas accepté votre réponse mais je l'ai trouvée très utile et vous ai voté à la hausse.
bigbadmouse
15

J'ai utilisé des balises pour l'entrée de plusieurs fichiers:

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
la source
C'est mieux que la réponse acceptée: elle autorise plusieurs entrées filebeat dans logstash. Dans de tels cas, la propriété "type" est définie sur "log" et ne peut pas être modifiée.
Régis B.
Mais n'est-ce pas écraser les balises par la dernière balise (bbb)? Et puis encore, dans le statememt if, si les balises étaient un tableau ou une seule chaîne, alors les deux IF fonctionneraient. Donc, logiquement, c'est incorrect, mais peut-être que logstash a une logique différente à l'intérieur des
ifs
0

Je pense que logstash ne peut pas lire plus de 2 fichiers dans la section Entrée. essayez ci-dessous

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
la source
Ouais, rencontrez le même `` problème ''
meso_2600