접근 로그에서 사고 시각 찾기
목표
1269줄짜리 접근 로그에서 사고 시각과 원인 경로를 10분 안에 찾아내고, 급증 폭을 평시값과 비교해 숫자로 말할 수 있게 됩니다.
왜 중요한가
"오류가 103건 있습니다" 는 정보가 아닙니다. 평소가 5건이었으면 심각하고 120건이었으면 개선된 것입니다. 그래서 로그 분석은 원인 찾기가 아니라 기준선 만들기에서 시작하고, 낯선 고객사에는 기준선 문서가 없으므로 같은 로그 안에서 만들어야 합니다. 사고 구간을 제외한 나머지가 곧 평시값입니다.
그리고 4xx 와 5xx 를 반드시 나눠 봅니다. 4xx 는 클라이언트가 잘못 보낸 것이고 5xx 는 서버가 망가진 것이라, 두 숫자가 같이 움직이는지 따로 움직이는지가 원인의 방향을 알려 줍니다. 배포 후 4xx 만 늘었다면 API 계약이 바뀐 것이고, 5xx 만 늘었다면 내부가 깨진 것입니다.
/opt/data/web.log 의 형식은 공백으로 구분된 다섯 필드입니다.
10.9.4.21 04:52:15 GET /api/pay 200
IP 시각 메서드 경로 상태코드
단계
/root/incident디렉터리를 만드세요.- 상태 코드가 500 인 요청의 총 개수를
/root/incident/total_500.txt에 적으세요. - 상태 코드가 404 인 요청의 총 개수를
/root/incident/total_404.txt에 적으세요. - 500 이 가장 많이 발생한 분을
HH:MM형태로/root/incident/peak_minute.txt에 적으세요. - 500 이 가장 많이 발생한 경로를
/root/incident/endpoint.txt에 적으세요. - 그 피크 1분 안에서 발생한 500 의 개수를
/root/incident/peak_count.txt에 적으세요. - 피크 분을 제외한 나머지 시간대의 500 개수를
/root/incident/baseline.txt에 적으세요. - 위 네 값이 모두 들어간 요약을
/root/incident/summary.txt에 쓰세요.
참고
awk '$5==500' /opt/data/web.log | wc -l- 분 단위 집계:
awk '$5==500 {print substr($2,1,5)}' /opt/data/web.log | sort | uniq -c | sort -rn | head - 경로 분포:
awk '$5==500 {print $4}' /opt/data/web.log | sort | uniq -c | sort -rn - 흔한 실수 1: 4번에서
HH:MM:SS전체를 적는 것. 초 단위로 자르면 분포가 흩어져 피크가 안 보입니다. - 흔한 실수 2: 7번에서 전체 로그 줄 수를 빼는 것. 빼야 할 것은 피크 분의 500 건수입니다.
작업 디렉터리 만들기
/root/incident 디렉터리를 만드세요.
/root/incident 아래에 분석 결과를 모읍니다.
500 총량 세기
상태 코드가 500 인 요청의 총 개수를 /root/incident/total_500.txt 에 적으세요.
web.log 의 마지막 필드가 상태 코드입니다. awk 로 그 필드가 500 인 줄만 세세요.
404 총량 세기
상태 코드가 404 인 요청의 총 개수를 /root/incident/total_404.txt 에 적으세요.
4xx 와 5xx 는 원인이 다릅니다. 함께 움직이는지 따로 움직이는지 보려면 따로 세야 합니다.
사고 시각 찾기
500 이 가장 많이 발생한 분을 HH:MM 형태로 /root/incident/peak_minute.txt 에 적으세요.
두 번째 필드가 HH:MM:SS 입니다. 앞 5글자만 잘라 500 이 가장 많이 몰린 분을 찾으세요.
원인 경로 찾기
500 이 가장 많이 발생한 경로를 /root/incident/endpoint.txt 에 적으세요.
500 인 줄만 골라 네 번째 필드의 분포를 보세요. 한 경로에 몰려 있는지 퍼져 있는지가 갈립니다.
피크 분의 오류 수 세기
그 피크 1분 안에서 발생한 500 의 개수를 /root/incident/peak_count.txt 에 적으세요.
그 1분 안에서만 500 이 몇 건인지. 앞 단계의 결과를 그대로 활용하세요.
평시 오류량 구하기
피크 분을 제외한 나머지 시간대의 500 개수를 /root/incident/baseline.txt 에 적으세요.
피크 분을 제외한 나머지 시간대의 500 수입니다. 전체에서 피크를 빼면 됩니다.
분석 요약 만들기
위 네 값이 모두 들어간 요약을 /root/incident/summary.txt 에 쓰세요.
총 500 건수, 사고 시각, 원인 경로, 평시값 네 가지를 한 파일에 모으세요.