GrepBoard/매뉴얼
47 편 ·

Nginx 접속 로그에서 5xx 를 내는 경로 찾기

·Nginx combined 로그 형식 · GNU awk 5.2 · 시험용으로 만든 로그(Ubuntu 24.04)·5 단계

awk 로 경로별 서버 오류를 세고, 쿼리 문자열을 합치고, 상태 코드와 시간대로 좁히는 한 줄 명령 — 기본 combined 형식 기준입니다.

기본 combined 형식에서 상태 코드는 9번째 칸, 요청 경로는 7번째 칸, 시각은 4번째 칸입니다. 아래 출력은 2026-10-17 하루치로 시험용으로 만든 로그(578줄, 5xx 58건)에 돌린 결과이며, 경로는 access.log 로 줄여 적었습니다. 운영 서버에서는 보통 /var/log/nginx/access.log 입니다.

[1] 경로별 5xx 응답 수를 셉니다.

console
$ 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 가 하나로 모입니다.

console
$ 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 은 앱이 스스로 낸 오류입니다.

console
$ 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번째 글자가 시(時)입니다.

console
$ 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시)만 골라 다시 경로별로 셉니다.

console
$ 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 /login

Nginx 로그를 브라우저에서 바로 분석 ↗ — 아무것도 올라가지 않습니다.

#nginx#awk#logs#5xx