블로그 릴레이 - CloudWatch Logs Insights 알아보기
안녕하세요! 제조 비즈니스 테크놀로지부의 이병현입니다.
본 블로그는 당사의 한국어 블로그 릴레이의 2025년 20번째 블로그입니다.
이번 블로그의 주제는 「CloudWatch Logs Insights 알아보기」 입니다.
CloudWatch Logs Insights란?
CloudWatch Logs Insights는 Amazon CloudWatch에서 제공하는 로그 분석 및 쿼리 서비스 입니다.
Amazon CloudWatch
CloudWatch Logs Insights를 사용한 로그 분석
문제가 생겼을 때 CloudWatch Logs에서 정보를 찾아내려면 각 로그 그룹별로 일일이 로그를 확인해야 했습니다. 특정 에러나 로그를 찾기 위해 여러 서비스에 걸친 로그를 분석하는 것은 상당히 번거로운 작업이었습니다.
하지만 CloudWatch Logs Insights를 사용하면 다음과 같은 장점이 있어서, 위의 문제들을 해결할 수 있습니다.
- 여러 로그 그룹을 한 번에 검색 가능
- SQL과 유사한 쿼리 언어로 복잡한 분석 수행
- 시간대별 집계, 필터링, 정렬 등 다양한 기능 활용
따라서 기존에 로그에서 정보를 찾아내는 과정이 훨씬 더 수월해집니다.
다만 사용량에 따른 비용이 발생하므로 스캔하는 데이터량을 고려해서 사용하는 것이 좋습니다.
사용해 보기
로그 준비
예시 로그를 만들기 위해, 아래와 같이 에러나, 경고가 랜덤하게 발생하는 AWS Lambda 함수를 만들어보겠습니다. 이 함수를 여러 번 실행해서 다양한 로그 패턴을 생성해보겠습니다.
export const handler = async (event, context) => {
const random = Math.random();
const orderId = Math.floor(Math.random() * 10000);
console.log(`Order ${orderId} processing started`);
console.log(`Request ID: ${context.awsRequestId}`);
if (random < 0.2) {
console.error(`ERROR: Order ${orderId} payment failed`);
return { statusCode: 500 };
} else if (random < 0.5) {
console.warn(`WARNING: Order ${orderId} processing slow`);
console.log(`SUCCESS: Order ${orderId} completed`);
return { statusCode: 200 };
} else {
console.log(`SUCCESS: Order ${orderId} completed`);
return { statusCode: 200 };
}
};
로그 찾아보기
아래와 같이 CloudWatch의 콘솔 화면에서, 로그 메뉴 하위에 Logs Insights라는 메뉴가 있습니다.
여러 로그 그룹을 접두사 등으로 여러 그룹을 선택하거나, 찾아보려는 여러 로그 그룹을 선택해서 설정할 수도 있습니다.
그러면, 콘솔에서 처음 제공해 주는 쿼리를 사용해 보겠습니다.
그러면 아래와 같이, 쿼리로 찾은 로그들을 볼 수 있게 됩니다. 히스토그램으로 로그의 시간 분포도도 확인 할 수 있습니다.
그럼 예를 들어, 에러 로그의 ERROR
메시지를 기준으로 찾아보겠습니다. 메시지를 찾기 위해서는 filter
라는 키워드와 @message like
를 통해 메시지를 정규식으로 찾아낼 수 있습니다.
fields @timestamp, @message, @logStream, @log
| filter @message like /ERROR/
| sort @timestamp desc
| limit 10000
만약, 1시간 이내에 발생한 로그라는 규칙을 추가하면 아래와 같이 작성할 수 있습니다. toMillis
와 now
함수를 이용하여, 현재 시간과 로그의 타임스탬프를 비교할 수 있습니다.
fields @timestamp, @message, @logStream, @log
| filter @message like /ERROR/
| filter toMillis(@timestamp) >= (now() * 1000 - 3600 * 1000)
| sort @timestamp desc
| limit 10000
더 자세한 쿼리의 문법은 아래 링크를 참고해 주세요.
CloudWatch Logs Insights 언어 쿼리 구문
CLI 버전
콘솔에서 확인할 수도 있지만, 개발 중에 바로 확인하고 싶은 경우도 있을 수 있습니다. 그런 경우 CLI를 통해서도 확인할 수 있습니다. CLI를 이용하는 경우, 아래의 예시처럼 스크립트를 만들어서 확인하는 방법도 있습니다.
#!/bin/bash
LOG_GROUPS=("/aws/lambda/log-test" "/xxx/xxx")
QUERY='fields @timestamp, @message, @logStream, @log | filter @message like /ERROR/ | sort @timestamp desc | limit 10000'
START_TIME=$(date -v-1H +%s)
END_TIME=$(date +%s)
echo "Querying from $(date -r $START_TIME) to $(date -r $END_TIME)"
echo "Log Groups: ${LOG_GROUPS[@]}"
QUERY_ID=$(aws logs start-query \
--log-group-names "${LOG_GROUPS[@]}" \
--start-time $START_TIME \
--end-time $END_TIME \
--query-string "$QUERY" \
--query 'queryId' --output text)
echo "Query ID: $QUERY_ID"
echo "Waiting for query to complete..."
sleep 3
aws logs get-query-results --query-id $QUERY_ID
위의 스크립트를 실행하면, 아래의 결과와 같이 나오는 것을 확인할 수 있습니다.
Querying from Sat Jun 21 17:11:45 KST 2025 to Sat Jun 21 18:11:45 KST 2025
Log Groups: /aws/lambda/log-test /xxx/xxx
Query ID: 485ec43f-9c5e-4ec1-96c6-a7a14d12f035
Waiting for query to complete...
{
"queryLanguage": "CWLI",
"results": [
[
{
"field": "@timestamp",
"value": "2025-06-21 08:28:06.853"
},
{
"field": "@message",
"value": "2025-06-21T08:28:06.853Z\t0c0bb5a2-77a4-4929-9681-c149c3f1a838\tERROR\tERROR: Order 1141 payment failed\n"
},
{
"field": "@logStream",
"value": "2025/06/21/[$LATEST]1cdb382ef36949d6a6119e0a540f40dc"
},
{
"field": "@log",
"value": "xxxxxxxxxx:/aws/lambda/log-test"
},
{
"field": "@ptr",
"value": "CpYBClsKITU4MjM3NzI3OTU3NjovYXdzL2xhbWJkYS9sb2ctdGVzdBAGGiQzNTQxYjc5Ni02MDMwLTQ5ZTctOTEzMC0xZGZhZGVlMTBkYWYiDgjoy6yM+TIQz7CIjvkyEjUaGAIGg68LtAAAAAAzpL9VAAaFZs9QAAACQiABKNW06Iz5MjDHwuiM+TI4DED0C0ioE1DbCiACEAgYAQ=="
}
],
...
마무리
CloudWatch Logs Insights를 사용하면 기존에 여러 로그 그룹을 일일이 확인하던 번거로움 없이, 한 번의 쿼리로 원하는 로그를 빠르게 찾을 수 있었습니다.
쿼리의 문법에 익숙해져야하는 것은 필요하지만, 몇 가지의 예시 쿼리들을 작성해나가다보면, 비슷한 상황에서 유용하게 재사용, 응용할 수 있을 것 같습니다.
콘솔 없이 이용하려면, CLI를 이용하는 스크립트를 만들어 필요한 상황에 맞게 변경해서 쓰면 매우 유용할 것 같습니다.
이상, 한국어 블로그 릴레이의 2025년 20번째 블로그 「CloudWatch Logs Insights 알아보기」 편이었습니다. 다음 21 번째 블로그 릴레이는 6월 넷째 주에 공개됩니다.
끝까지 읽어주셔서 감사합니다! 이상, 제조 비즈니스 테크놀로지부의 이병현입니다.
문의 사항은 클래스메소드 코리아로!
클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트에 대해 아래 페이지를 참고해주세요.
AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr