Comment puis-je correspond à un saut de ligne dans grok/logstash?
J'ai une machine distante qui combine multiligne événements et les envoie à travers le bûcheron protocole.
Ce qui vient est quelque chose qui ressemble à ceci:
{
"message" => "2014-10-20T20:52:56.133+0000 host 2014-10-20 15:52:56,036 [ERROR ][app.logic ] Failed to turn message into JSON\nTraceback (most recent call last):\n File \"somefile.py", line 249, in _get_values\n return r.json()\n File \"/path/to/env/lib/python3.4/site-packages/requests/models.py\", line 793, in json\n return json.loads(self.text, **kwargs)\n File \"/usr/local/lib/python3.4/json/__init__.py\", line 318, in loads\n return _default_decoder.decode(s)\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 343, in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 361, in raw_decode\n raise ValueError(errmsg(\"Expecting value\", s, err.value)) from None\nValueError: Expecting value: line 1 column 1 (char 0), Failed to turn message into JSON"
}
Quand j'ai essayer de faire correspondre le message avec
grok {
match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%LOGLEVEL:loglevel}%{ SPACE}\]\[%{NOTSPACE:module}%{SPACE}\]%{GREEDYDATA:message}" ]
}
la GREEDYDATA
n'est pas aussi gourmand que je le voudrais.
Alors j'ai essayé d'utiliser gsub:
mutate {
gsub => ["message", "\n", "LINE_BREAK"]
}
# Grok goes here
mutate {
gsub => ["message", "LINE_BREAK", "\n"]
}
mais que l'on n'a pas de travail plutôt que de
The Quick brown fox
jumps over the lazy
groks
J'ai eu
The Quick brown fox\njumps over the lazy\ngroks
Donc...
Comment puis-je ajouter le saut de ligne retour à mes données, faire de la GREEDYDATA
correspond à mes retours à la ligne, ou de quelque autre manière de saisir une partie de mon message?
- Ressemble à une copie de stackoverflow.com/questions/24307965/....
- en principe oui, mais cette question ne se soucient pas de retours à la ligne mais je ne le requièrent les retours à la ligne à exister dans le message.
Vous devez vous connecter pour publier un commentaire.
Tous
GREEDYDATA
est.*
, mais.
ne correspond pas de saut de ligne, de sorte que vous pouvez remplacer%{GREEDYDATA:message}
avec(?<message>(.|\r|\n)*)
et qu'il soit vraiment gourmand.(?<message>(.|\r|\n)*)
l'a fait! A 20 onglets ouverts et ici, je le trouve dans une très upvoted réponse. Je vous remercie beaucoup.(.|\r|\n)*
est l'un des plus malchanceux des motifs qui sont le mal absolu, comme c'est le rendement tueur modèle. Pour correspondre à n'importe quel caractère avec.
, il suffit d'utiliser le modificateur approprié, dans Oniguruma, il est(?m)
. En PCRE et PCRE liées saveurs, utilisez(?s)
. En JS, utilisez[^]
ou[\s\S]
au lieu d'un point.L'ajout de l'expression rationnelle drapeau au début permet pour la mise en correspondance des retours à la ligne:
"Message" => "The computer attempted to validate the credentials for an account.\r\n\r\nAuthentication Package:\tMICROSOFT_AUTHENTICATION_PACKAGE_V1_0\r\n
Code:gsub => [ "Message", "^(?m)([^\r]*).*", "\1" ]
de Sortie:"Message" => "The computer attempted to validate the credentials for an account."