複数行のイベントを組み合わせ、lumberjackプロトコルを介して送信するリモートマシンがあります。
入ってくるのは次のようなものです:
{
"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"
}
メッセージを一致させようとすると
grok {
match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%LOGLEVEL:loglevel}%{ SPACE}\]\[%{NOTSPACE:module}%{SPACE}\]%{GREEDYDATA:message}" ]
}
GREEDYDATA
は私が望むほど欲張りではありません。
だから、私はgsubを使用しようとしました:
mutate {
gsub => ["message", "\n", "LINE_BREAK"]
}
# Grok goes here
mutate {
gsub => ["message", "LINE_BREAK", "\n"]
}
しかし、その1つではなく、動作しませんでした
The Quick brown fox
jumps over the lazy
groks
わかった
The Quick brown fox\njumps over the lazy\ngroks
そう...
データに改行を追加し直す、GREEDYDATA
を改行に合わせる、または他の方法でメッセージの関連部分を取得するにはどうすればよいですか?
GREEDYDATA
はすべて.*
、 だが .
は改行と一致しないため、%{GREEDYDATA:message}
with (?<message>(.|\r|\n)*)
そしてそれを本当に貪欲にする。
正規表現フラグを先頭に追加すると、一致する改行を許可します。
match => [ "message", "(?m)%{TIMESTA...