Как анализировать смешанный текст и записи журнала JSON в AWS CloudWatch для фильтра метрик журнала

Я пытаюсь проанализировать записи журнала, которые представляют собой смесь текста и JSON. Первая строка - текстовое представление, а следующие строки - полезная нагрузка JSON события. Один из возможных примеров:

2016-07-24T21:08:07.888Z [INFO] Command completed lessonrecords-create
{
  "key": "lessonrecords-create",
  "correlationId": "c1c07081-3f67-4ab3-a5e2-1b3a16c87961",
  "result": {
    "id": "9457ce88-4e6f-4084-bbea-14fff78ce5b6",
    "status": "NA",
    "private": false,
    "note": "Test note",
    "time": "2016-02-01T01:24:00.000Z",
    "updatedAt": "2016-07-24T21:08:07.879Z",
    "createdAt": "2016-07-24T21:08:07.879Z",
    "authorId": null,
    "lessonId": null,
    "groupId": null
  }
}

Для этих записей я пытаюсь определить Log Metric Filter, чтобы: a) сопоставить записи b) выбрать данные или измерения, если это возможно.

В соответствии с документами AWS шаблон JSON должен выглядеть следующим образом:

{ $.key = "lessonrecords-create" }

однако это ничего не соответствует. Я предполагаю, что из-за смешанного текста и JSON в одной записи журнала.

Итак, вопросы: 1. Можно ли определить шаблон, который будет соответствовать этому формату журнала? 2. Можно ли извлечь размеры, значения из такого формата журнала? 3. Помогите мне с шаблоном, чтобы сделать это.

6 ответов

Допустим, у вас есть следующий журнал

      2021-09-29 15:51:18,624 [main] DEBUG com.company.app.SparkResources - AUDIT : {"user":"Raspoutine","method":"GET","pathInfo":"/analysis/123"}

вы можете проанализировать его так, чтобы иметь возможность обрабатывать часть после "AUDIT:" как JSON

      fields @message
| parse @message "* [*] * * - AUDIT : *" as timestamp, thread, logLevel, clazz, msg
| filter ispresent(msg)
| filter method = "GET" # You can use fields which are contained in the JSON String of 'msg' field. Do not use 'msg.method' but directly 'method'

Поля, содержащиеся в изолированном / проанализированном поле JSON, автоматически добавляются как поля, используемые в запросе.

Если вы настроили фильтр метрик так, как вы его определили, тест не будет регистрировать совпадения (у меня тоже была эта проблема), однако при развертывании фильтра метрик он все равно будет регистрировать совпадения (по крайней мере, мой сделал). Просто имейте в виду, что нет способа (насколько я знаю) запустить этот метрический фильтр BACKWARDS (т.е. он будет собирать данные только с момента его создания). [Если вы пытаетесь получить статистику прошлых данных, вам лучше использовать запросы на понимание журнала]

В настоящее время я экспериментирую с различными операторами синтаксического анализа, чтобы попытаться извлечь данные (это также смесь JSON и текста), этот поток МОЖЕТ помочь вам (но не для меня) в Amazon Cloudwatch Logs Insights с полями JSON.

ОБНОВИТЬ! Я нашел способ разобрать текст, но он немного неуклюжий. Если вы экспортируете свои журналы cloudwatch, используя функцию lamda, в SumoLogic, их инструмент поиска позволяет НАМНОГО лучше манипулировать журналами и позволяет анализировать поля JSON (если вы рассматриваете всю запись как текст). SumoLogic также очень полезен, потому что вы можете просто извлечь результаты поиска в формате CSV. Для моих целей я анализирую все сообщения журнала в SumoLogic, извлекаю все журналы как CSV, а затем использую регулярное выражение в Python для фильтрации и извлечения необходимых мне значений.

Вы можете использовать CloudWatch Events для этой цели (также известные как фильтры подписки), вам нужно будет определить правило облачного наблюдения, которое использует выражение выражения для соответствия вашим журналам. Здесь я позволю вам прочитать все:

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html

:)

Разделите сообщение на 3 поля, и третье поле будет действительным json. Думаю, в твоем случае это было бы

      fields @timestamp, @message 
| parse @message '[] * {"*"}' as field1, field2, field3
| limit 50

field3 - это действительный файл json. [ИНФОРМАЦИЯ} будет первым полем.

Вы можете искать строковое представление JSON, которое не так мощно.

Для вашего примера,

вместо { $.key = "lessonrecords-create" }

пытаться "\"key\":\"lessonrecords-create\"".

Однако этот фильтр семантически не идентичен вашему требованию. Это также даст события, где keyне находится в корне json.

Вы можете использовать fluentd agent для отправки журналов в Cloudwatch. Создайте собственный шаблон Grok на основе вашего метрического фильтра.

Шаги:

  • Установите fluentd agent на свой сервер
  • Установите плагин fluent-plugin-cloudwatch-logs и плагин fluent-plugin-grok-parser
  • напишите свой собственный шаблон Grok на основе вашего формата журнала

    пожалуйста, обратитесь к этому блогу для получения дополнительной информации

Другие вопросы по тегам