itsource

Amazon Cloudwatch Logs Insights with JSON 필드

mycopycode 2023. 3. 13. 20:28
반응형

Amazon Cloudwatch Logs Insights with JSON 필드

필드 중 하나에 JSON이 포함된 데이터와 Logs Insights를 사용하여 JSON 필드를 해석하려고 합니다.

스타터 코드를 사용하여 데이터를 통찰에 넣으면 다음과 같이 표시됩니다.

fields @timestamp, @message
| sort @timestamp desc
| limit 25

어떻게 하면 쉽게 추출할 수 있을까요?path변수에서 집계를 수행하기 위해 중첩된 JSON의 변수? 몇 가지 문서를 보고, 나는 생각했다.@message.path효과가 있을 것 같지만, 그렇지 않은 것 같습니다.인사이트에서 JSON 로그를 해석한 사람이 있습니까?

여기에 이미지 설명 입력

EDIT : 데이터 표시 예시

#
@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)"}

CloudWatch Insights 로그는 다음과 같은 로그 유형에 대한 필드를 자동으로 검색합니다.

람다 로그

CloudWatch Logs Insights는 Lambda 로그의 로그 필드를 자동으로 검색하지만, 각 로그 이벤트의 첫 번째 내장 JSON 조각에 대해서만 검색합니다(참고: 강조 사항).Lambda 로그이벤트에 여러 JSON fragment가 포함되어 있는 경우 parse 명령을 사용하여 로그필드를 해석 및 추출할 수 있습니다.자세한 내용은 JSON 로그의 필드를 참조하십시오.

CloudTrail 로그

JSON 로그의 필드를 참조해 주세요.

출처: 지원되는 로그 및 검색된 필드

한다면@messageI, [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".

명령어를 사용하여 필드를 추출할 수 있습니다.

한다면@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

그 서류는 지금으로서는 다소 가볍다.와일드카드를 대체하여 결과를 얻을 수 있다.*정규 표현을 사용해도 해석은 실패합니다.

@pyb insights를 바탕으로 사용할 수 있었습니다.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":"*.*.*.*"}

regex의 도움을 받아 다른 해석도 가능

@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>.*?)\"/

parse 명령어 내의 regex 쿼리가 도움이 됩니까?

filter @message like / \"path\":\"/
| parse @message /(?<@endpt>((\/[a-zA-Z0-9_{}()-?]+){1,}))/

행운을 빕니다.

언급URL : https://stackoverflow.com/questions/53725133/amazon-cloudwatch-logs-insights-with-json-fields

반응형