将matcher集成到logstash grok配置中出错。

问题描述 投票:0回答:1

我正在使用logstash 7.6.2。 我的日志行是json字符串。 每个 json 有 3 个字段,"msg "是文本,"topic "是文本,"ts "是浮点数。

这是我的匹配表达式。

{"msg"\s*:\s*(?<msg>".*")\s*,\s*"topic"\s*:\s*(?<topic>".*")\s*,\s*"ts"\s*:\s*(?<ts>[+-]?([0-9]*[.])?[0-9]+)\s*}

这里有两个日志行的例子

{"msg": "2020-05-01 01:09:06,043 ERROR [luna_messaging.handlers.base] HTTP 400: {\"success\": false}\nTraceback (most recent call last):\n  File \"/home/lunalife/luna_messaging/handlers/base.py\", line 238, in wrapper\n    yield func(self, *args, **kwargs)\n  File \"/home/lunalife/.local/lib/python2.7/site-packages/tornado/gen.py\", line 1015, in run\n    value = future.result()\n  File \"/home/lunalife/.local/lib/python2.7/site-packages/tornado/concurrent.py\", line 237, in result\n    raise_exc_info(self._exc_info)\n  File \"/home/lunalife/.local/lib/python2.7/site-packages/tornado/gen.py\", line 1021, in run\n    yielded = self.gen.throw(*exc_info)\n  File \"/home/lunalife/luna_messaging/handlers/device_status.py\", line 41, in get\n    raise tornado.web.HTTPError(400, reason=json.dumps(reason))\nHTTPError: HTTP 400: {\"success\": false}", "topic": "com.walker.prod.luna_messaging.handlers.base", "ts": 1588295346.043578}
{"msg": "2020-05-01 01:09:06,076 ERROR [luna_messaging.handlers.base] HTTP 403: Forbidden\nTraceback (most recent call last):\n  File \"/home/lunalife/luna_messaging/handlers/base.py\", line 238, in wrapper\n    yield func(self, *args, **kwargs)\n  File \"/home/lunalife/.local/lib/python2.7/site-packages/tornado/gen.py\", line 1015, in run\n    value = future.result()\n  File \"/home/lunalife/.local/lib/python2.7/site-packages/tornado/concurrent.py\", line 237, in result\n    raise_exc_info(self._exc_info)\n  File \"/home/lunalife/.local/lib/python2.7/site-packages/tornado/gen.py\", line 1024, in run\n    yielded = self.gen.send(value)\n  File \"/home/lunalife/luna_messaging/handlers/device_status.py\", line 46, in get\n    raise tornado.web.HTTPError(403)\nHTTPError: HTTP 403: Forbidden", "topic": "com.walker.prod.luna_messaging.handlers.base", "ts": 1588295346.076928}```

我用了几个grok测试器来证明它是有效的. https:/grokdebug.herokuapp.comhttps:/grokconstructor.appspot.comdomatch

问题是,当我整合到我的logstash配置中时,它给我一个语法错误。 我不知道我做错了什么。

这是我的logstash配置中的grok matcher。

grok {
   match => {"msg"\s*:\s*(?<msg>".*")\s*,\s*"topic"\s*:\s*(?<topic>".*")\s*,\s*"ts"\s*:\s*(?<ts>[+-]?([0-9]*[.])?[0-9]+)\s*}
}

而这是logstash的启动错误。

Expected one of [ \\t\\r\\n], \"#\", \"=>\" at line 44, column 21

我相信我的匹配表达式是正确的 但我不知道怎么把它添加到grok配置中去 任何帮助将是感激的。

logstash logstash-grok logstash-configuration grok
1个回答
1
投票

你需要告诉grok过滤器应该在哪个字段上应用模式匹配。

正如你可以从文档中看到的那样(https:/www.elastic.coguideenlogstashcurrentplugins-filters-grok.html#plugins-filters-grok-match),匹配设置的语法为

grok{
  match => { "FIELDNAME" => "PATTERN" }
}

Logstash将日志行文本放入的默认字段称为 message. 所以你可以这样调整你的代码。

grok{
  match => { "message" => "PATTERN" }
}

此外,请注意,模式必须用引号,特殊字符必须被转义(我在下面的例子中没有做后者)。由于你在模式本身中使用了双引号,你需要使用单引号,如下图。

grok{
  match => { 'message' => '{"msg"\s*:\s*(?<msg>".*")\s*,\s*"topic"\s*:\s*(?<topic>".*")\s*,\s*"ts"\s*:\s*(?<ts>[+-]?([0-9]*[.])?[0-9]+)\s*}' }
}

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.