Amazon Cloudwatch Logs Insights с полями JSON
Я пытаюсь использовать Logs Insights с данными, содержащими JSON в одном из полей, и для анализа полей JSON
Мои данные выглядят следующим образом, когда я делаю это с помощью начального кода
fields @timestamp, @message
| sort @timestamp desc
| limit 25
Как я могу легко извлечь path
переменная в моем вложенном JSON для агрегирования? Посмотрев какую-то документацию, я подумал @message.path
будет работать, но это не так. Кто-нибудь успешно интерпретировал журналы JSON в Insights?
РЕДАКТИРОВАТЬ: Пример того, как выглядят мои данные
#
@timestamp
@message
1
2018-12-19 23:42:52.000
I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"user,tags,promotions,company_sector,similar_professionals.tags,similar_professionals.user","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@logStream i-05d1d61ab853517a0
@message I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@timestamp 1545262972000
2
2018-12-19 23:42:16.000
I, [2018-12-19T23:42:16.723472 #851] INFO -- : [ea712503-eb86-4a6e-ab38-ddbcd6c2b4d0] {"method":"GET","path":"/api/v1/heartbeats/new","format":"json","controller":"API::V1::Public::HeartbeatsController","action":"new","status":201,"duration":9.97,"view":3.2,"time":"2018-12-19T23:42:16.712+00:00","params":{"format":"json","compress":false},"@timestamp":"2018-12-19T23:42:16.722Z","@version":"1","message":"[201] GET /api/v1/heartbeats/new (API::V1::Public::HeartbeatsController#new)"}
3 ответа
CloudWatch Insights Logs автоматически обнаруживает поля для следующих типов журналов:
Лямбда бревна
CloudWatch Logs Insights автоматически обнаруживает поля журнала в лямбда-журналах, но только для первого внедренного фрагмента JSON в каждом событии журнала (Примечание: выделено мое). Если событие Lambda log содержит несколько фрагментов JSON, вы можете проанализировать и извлечь поля журнала, используя команду parse. Для получения дополнительной информации см. Поля в журналах JSON.
Журналы CloudTrail
Смотрите поля в журналах JSON.
Источник: поддерживаемые журналы и обнаруженные поля
Если @message
является I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}
Затем вы можете выбрать и отфильтровать поля следующим образом:
fields @timestamp, @message, method
| filter method = "GET"
| sort @timestamp desc
Работает и с вложенными полями, т.е. params.format = "json"
или же results.0.firstName = "Paul"
,
Опираясь на идеи @pyb, я смог использовать parse @message '"path":"*"' as path
извлечь путь из любого места в @message
,
Вы можете продолжить, чтобы получить свой метод, отправив по трубопроводу другой parse @message '"method":"*"' as method
без беспокойства о порядке, так как это второй глобальный поиск по простому тексту на @message
В случае, когда ваш @message
является:
I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
С помощью:
parse @message '"path":"*"' as path | parse @message '"method":"*"' as method
приведет к полям: path = '/api/v1/professionals/ID'
а также method = 'GET'
Обратите внимание, что это все еще просто синтаксический анализ строк, и поэтому он не имеет понятия о вложенных ключах, таких как params.format
не нашел бы json
Однако используя только format
будет, пока не было другого format
строка в любом месте вашего @message
,
Также обратите внимание, что это относится к случаю, когда Insights не обнаруживает ваш JSON в сообщении. Я верю, что это тот случай, на который @pyb ссылался в этом ответе. Мои журналы также не обнаруживаются в следующем формате
info - Request: {"method":"POST","path":"/auth/login/","body":{"login":{"email":"email@example.com","password":"********"}},"uuid":"36d76df2-aec4-4549-8b73-f237e8f14e23","ip":"*.*.*.*"}
Вы можете использовать parse
Команда для извлечения полей.
Если @message
является
I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}
Затем вы извлекаете поля следующим образом:
fields @timestamp, @message
| parse "I, [*T*] INFO -- : {"method":"*"}" as @date, @time, @method
| filter method=GET
| sort @timestamp desc
| limit 20
Документация довольно легкая на данный момент. Я могу получить результаты, заменив подстановочный знак *
с регулярным выражением, но тогда синтаксический анализ не удается.
Также еще один синтаксический анализ с помощью регулярного выражения
Предположим, ваш @message
является:
I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/"}
Вы можете извлечь метод
fields @timestamp, @message
| parse @message /\"method\":\"(?<method_type>.*?)\"/
Поможет ли вам этот запрос регулярного выражения в команде разбора?
filter @message like / \"path\":\"/
| parse @message /(?<@endpt>((\/[a-zA-Z0-9_{}()-?]+){1,}))/
Удачи!