Ошибка интеграции matcher в конфигурацию logsta sh grok - PullRequest
0 голосов
/ 01 мая 2020

Я использую logsta sh 7.6.2. У меня есть строки журнала, которые json строки. Каждый json имеет 3 поля: «msg» - текст, «topi c» - текст, а «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.com/do/match

Проблема в том, что при интеграции в конфигурацию logsta sh возникает синтаксическая ошибка. Я не уверен, что делаю не так.

Это сопоставление grok в моей конфигурации logsta sh:

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

и это ошибка запуска logsta sh:

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

Я считаю, что мое совпадающее выражение корректно, но я не знаю, как добавить его в конфигурацию grok. Любая помощь будет оценена.

1 Ответ

1 голос
/ 01 мая 2020

Вы должны указать фильтру grok, к какому полю должно применяться сопоставление с образцом.

Как видно из документации (https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins -filters-grok-match ), настройка совпадения соответствует синтаксису

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

По умолчанию Поле Logsta sh, в которое помещается текст строки журнала, называется 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*}' }
}

Я надеюсь, что смогу вам помочь.

...