CloudWatch Logs에 저장된 로그에서 Insights를 사용하여 데이터 추출

4760 단어 aws-cliAWS

하고 싶은 일



CloudWatch Logs에서 수집한 로그에 API 서버가 접수한 요청의 경로와 요청한 사용자 ID가 기록되어 있으므로 특정 API를 호출한 날짜와 시간과 사용자 ID 목록을 만들고 싶습니다. .

CloudWatch Logs에서 수집한 로그



CloudWatch Logs 메시지에는 아래와 같은 JOSN 형식의 로그가 출력됩니다.

CloudWatchLogs의 메시지
{
    "access_timestamp": "2019-02-13T10:54:25+09:00",
    "level": "info",
    "method": "POST",
    "path": "/path/to/resource/sub_resource",
    "query": {
        "param1": "value1",
        "param2": "value2",
        "param3": "value3",
    },
    "user_id": "dfc269bf-c08a-48a2-a6e3-14dd25f5350a",
    "status": "200",
}

만들고 싶은 것



위의 JSON에 대해 원하는 path를 지정하여 status가 "200"(성공) 로그를 추출하여 access_timestampuser_id의 목록을 만듭니다.
"2019-02-13T10:54:25+09:00","dfc269bf-c08a-48a2-a6e3-14dd25f5350a"
"2019-02-13T10:55:16+09:00","908cbf68-744f-41ea-a202-667b129029ca"
"2019-02-13T10:56:14+09:00","5000adc0-da5d-4d58-aad2-f5d4e8c32426"

aws cli로 열심히



aws logs start-query에서 Insights를 사용합니다.

Insights 문의 시작
aws logs start-query --log-group-name 'my-log-group' --start-time 1550012400 --end-time 1550014200 \
 --query-string 'fields, @message
| filter ( access_url =~ "/path/to/resource/" and level ="INFO" and method = "POST" and status = "200")
'

인수 --query-stringfilter 는 CloudWatchLogs message에 기록된 JSON 키를 지정합니다. JSON 키 access_url , level , method , status 는 자동으로 인식되는 것 같습니다. AWS 콘솔에서 로그 그룹 이름을 지정하면 오른쪽의 '검색된 필드에'에 키 이름이 표시되므로 확인할 수 있습니다.



Insights 처리가 끝나면 queryId를 얻을 수 있으므로 queryId를 지정하여 결과를 검색합니다.

queryId 출력
{
    "queryId": "5000adc0-da5d-4d58-aad2-f5d4e8c32426"
}

마지막으로 jq를 사용하여 access_timestamp와 user_id를 출력합니다.

Insights 결과에서 access_timestamp 및 user_id 출력
aws logs get-query-results --query-id 5000adc0-da5d-4d58-aad2-f5d4e8c32426 |  \
jq -r  '.results[] | map ( select( .field == "@message")) | .[].value ' | jq -r '[. access_timestamp, .user_id] | @csv'

좋은 웹페이지 즐겨찾기