web-dev-qa-db-fra.com

Comment faire correspondre une nouvelle ligne dans grok / logstash?

J'ai une machine distante qui combine des événements multilignes et les envoie via le protocole de bûcheron.

Ce qui arrive 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"
}

Lorsque j'essaie de faire correspondre le message avec

grok {         
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%LOGLEVEL:loglevel}%{    SPACE}\]\[%{NOTSPACE:module}%{SPACE}\]%{GREEDYDATA:message}" ]
}

le 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 celui-là n'a pas fonctionné plutôt que

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 la nouvelle ligne à mes données, faire en sorte que le GREEDYDATA corresponde à mes nouvelles lignes ou, d'une autre manière, récupérer la partie pertinente de mon message?

24
Wayne Werner

Tout GREEDYDATA est est .*, mais . ne correspond pas à la nouvelle ligne, vous pouvez donc remplacer %{GREEDYDATA:message} avec (?<message>(.|\r|\n)*)et faites en sorte qu'il soit vraiment gourmand.

70
Alcanzar

L'ajout du drapeau regex au début permet de faire correspondre les sauts de ligne:

match => [ "message", "(?m)%{TIMESTA...
18
Wayne Werner