1 votes

Les journaux ELK de l'application disparaissent lorsque les règles grok sont activées

Nous avons deux instances d'une application (même application, base de données différente), appelons-les app1 et app2. Le chemin que prennent les journaux est le suivant:

  1. appX exécute filebeat, qui récupère le fichier journal de l'application, l'étiquette avec appX, et envoie chaque entrée à une instance de logstash sur un cluster rabbitmq. Ensuite, il est ajouté à rabbitmq.
  2. Le message traverse le cluster rabbitmq et est consommé par une autre instance de logstash, qui exécute divers filtres en fonction de l'étiquette.
  3. La même instance de logstash soumet la ligne de journal résultante à elasticsearch.

Tout va bien. Dans le cas d'app1 & 2, les filtres sont un grok, qui divise le message en champs sur lesquels nous pouvons ensuite effectuer des recherches.

app1 fonctionne, les journaux sont traités par le filtre et apparaissent dans l'index correct dans elasticsearch comme prévu.

app2 ne fonctionne pas. Le problème se trouve dans les règles grok, je le sais car si je supprime les règles grok qui sont exécutées pour app2, les journaux apparaissent comme prévu. Dès que je dé-commente les règles grok, les journaux d'app2 cessent d'apparaître dans elasticsearch nulle part

Le filtre pour app1 et app2 est identique:

filter {
    if "app2" in [tags] {
            mutate {
                    gsub => ["message", "\n", "LINE_BREAK"]
            }
            grok {
                    match => [ "message", "%{TIMESTAMP_ISO8601:time}\s+%{WORD:level}\s+\[%{DATA:thread_name}\]\s+%{DATA:class}\:%{DATA:line} %{DATA:method}\s*-\s*%{DATA:message}$" ]
                    overwrite => [ "message" ]
            }
            date {
                    match => [ "time", "YYYY-MM-dd HH:mm:ss,SSS"]
                    target => "@timestamp"
            }
            mutate {
                    remove_field => [ "time" ]  # Supprime le champ 'time'                        
            }
    } 
}

Je soupçonne qu'elasticsearch refuse d'indexer les journaux d'app2. Naturellement, j'ai vérifié les journaux d'elasticsearch et de logstash, mais aucun problème n'est signalé. Cela m'a amené à enquêter sur la façon d'"augmenter" le journal dans elasticsearch.

Est-ce que quelqu'un sait comment obtenir elasticsearch pour signaler les erreurs liées à l'ingestion de ces journaux? ou a une idée de comment je peux savoir ce qui arrive aux journaux d'app2 lorsque le grok est activé?

J'ai essayé ceci:

    # curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{ 
  "transient": {
"logger._root": "trace" 
 } 
}
'

ce qui me donne prévisiblement un "tuyau d'incendie dans la bouche" mais au moins quelque chose de greppable. L'étiquette n'est mentionnée que en termes de traitement d'une ligne de journal spécifique.

Merci d'avance.

Un peu plus à ce sujet: je viens d'exécuter logstash avec les règles grok d'app2 en place, et avec le journalisation du filtre activée comme ceci:

# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
"logger.logstash.filters.grok" : "ALL"
}'

Aucune erreur n'apparaît, ce qui confirme encore ma théorie selon laquelle les règles grok elles-mêmes sont correctes et que c'est elasticsearch qui refuse d'indexer les messages. J'ai également fait ceci:

# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d' 
{
"logger.logstash.outputs.elasticsearch" : "ALL"
} '

Pour vérifier qu'il n'y a pas d'erreurs d'indexation. Bien qu'aucune erreur ne soit signalée, de manière quelque peu inquiétante, RIEN n'est signalé, ce qui me fait me demander si je me trompe complètement.

2voto

sysadmin1138 Points 129885

Dans mon expérience, quand ES plante sur une insertion, il la plante directement dans les journaux pour que le pauvre humain la décode et la comprenne. Je le vois généralement lorsqu'il y a un problème de mapping. Soit une collision de types soit un document mal formé.

(C'est la raison numéro un pour laquelle je ne journalise pas mes logs ES. Cette mauvaise ingestion échouera à nouveau lorsqu'elle sera dans les logs ES, et le cycle d'erreurs se répètera. De plus, c'est une bombe de données personnelles dans les cas appropriés)

Une autre étape de dépannage à essayer est de définir une sortie conditionnelle juste à côté de la sortie ES pour laisser tomber les événements app1 et app2 dans un fichier. Cela vous donnera la possibilité de les regarder côte à côte dans l'état où ils seraient envoyés à ES. Cela peut révéler des indices sur ce qui se passe. Peut-être qu'un autre stade de filtrage en manipule un. Ou peut-être que app2 n'arrive jamais jusque là, donc le problème est entre le filtre et les étapes output {}.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X