Nginx 접속 로그에서 5xx 를 내는 경로 찾기
awk 로 경로별 서버 오류를 세고, 쿼리 문자열을 합치고, 상태 코드와 시간대로 좁히는 한 줄 명령 — 기본 combined 형식 기준입니다.
기본 combined 형식에서 상태 코드는 9번째 칸, 요청 경로는 7번째 칸, 시각은 4번째 칸입니다. 아래 출력은 2026-10-17 하루치로 시험용으로 만든 로그(578줄, 5xx 58건)에 돌린 결과이며, 경로는 access.log 로 줄여 적었습니다. 운영 서버에서는 보통 /var/log/nginx/access.log 입니다.
[1] 경로별 5xx 응답 수를 셉니다.
$ awk '$9 ~ /^5/ {print $7}' access.log | sort | uniq -c | sort -rn | head 41 /api/upload 6 /api/search?q=log 3 /login 2 /api/search?q=nginx 2 /api/search?q=awk 2 /api/search?q=a+b 2 /api/items/7[2] 쿼리 문자열을 떼서 /a?x=1 과 /a?x=2 를 한 경로로 셉니다. 위에서 따로 잡힌 /api/search 가 하나로 모입니다.
$ awk '$9 ~ /^5/ {split($7, p, "?"); print p[1]}' access.log | sort | uniq -c | sort -rn | head 41 /api/upload 12 /api/search 3 /login 2 /api/items/7[3] 어떤 5xx 인지 상태 코드별로 봅니다. 502·504 는 뒤쪽 앱이 답하지 않았거나 느렸다는 뜻이고, 500 은 앱이 스스로 낸 오류입니다.
$ awk '$9 ~ /^5/ {print $9}' access.log | sort | uniq -c | sort -rn 22 500 20 502 11 504 5 503[4] 시간대별로 센 뒤 몰린 시간을 찾습니다. 4번째 칸 [17/Oct/2026:10:05:12 에서 14~15번째 글자가 시(時)입니다.
$ awk '$9 ~ /^5/ {print substr($4, 14, 2)}' access.log | sort | uniq -c 1 03 3 09 39 10 10 11 3 15 1 16 1 21[5] 몰린 한 시간(10시)만 골라 다시 경로별로 셉니다.
$ awk '$4 ~ /17\/Oct\/2026:10:/ && $9 ~ /^5/ {split($7, p, "?"); print p[1]}' access.log | sort | uniq -c | sort -rn 28 /api/upload 9 /api/search 2 /loginNginx 로그를 브라우저에서 바로 분석 ↗ — 아무것도 올라가지 않습니다.