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:
- 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.
- 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.
- 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.