Grok не возвращает допустимый JSON

#java #json #grok

Вопрос:

следующая строка журнала дает недопустимый json для шаблона grok

  2021-06-15 10:05:55:617|[28]|test-backend|ERROR|STDOUT|test|test-service|abcd1234|API_CALL|test|Error|Controller {"testtag":["test error message"]}
 

Грок

 (?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}.%{NONNEGINT})|[(?<thread>[^]] )]|%{IPORHOST:pod_instance}|%{LOGLEVEL:severity}|%{GREEDYDATA}|%{GREEDYDATA:application}|%{GREEDYDATA:microservice}|%{UUID:uuid}|(?<message_type>[^|]*)|(?<message>[^|]*)(?<options>(?:(|.*)|(|AD.*)|()))
 

и тег опции возвращается как

  "options": [
[
  "|Error|Controller {"testtag":["test error message"]}"
 ...
 

из-за этого весь json становится недействительным. Я хочу, чтобы это генерировалось как допустимый json. Есть ли способ добавить escape для дополнительной цитаты " в строке json что-то вроде belo

 "|Error|Controller {"testtag":["test error message"]}"
 

Ответ №1:

Вы можете попробовать комбинацию фильтра GROK и KV, чтобы отфильтровать сообщение журнала.

Сначала используйте приведенный ниже шаблон grok, чтобы отфильтровать сообщение журнала по различным полям:

 (?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}.%{NONNEGINT})|[(?<thread>[^]] )]|%{IPORHOST:pod_instance}|%{LOGLEVEL:severity}|%{GREEDYDATA}|%{GREEDYDATA:application}|%{GREEDYDATA:microservice}|%{UUID:uuid}|(?<message_type>[^|]*)|(?<message>[^|]*)|(?<message_error>[^|]*)|(?<message_error_part>[^|]*) {%{GREEDYDATA:tagmsg}}
 

Теперь мы будем использовать KV для фильтрации поля tag , содержащего часть json.

 filter {
      kv {
        source => "tagmsg",
        value_split => ":",
        trim_value => "[]"
      }
    }
 

Пожалуйста, обратитесь к фильтру KV для получения дополнительных параметров конфигурации фильтра.