我正在使用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.com 和 https:/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配置中去 任何帮助将是感激的。
你需要告诉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*}' }
}
希望能帮到你。