#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 для получения дополнительных параметров конфигурации фильтра.