로그와 장애 진단
Web Server, WAS, Application, DB 로그를 따라 502, 404, 500 같은 장애를 좁히는 순서를 정리한다.
로그로 따라가는 요청
Client
-> Web Server log
-> WAS log
-> Application log
-> DB log
진단의 기준
장애 진단은 “어느 계층의 로그까지 요청이 도달했는가”를 확인하면서 원인 범위를 좁히는 과정이다.
로그 지도
| 계층 | 대표 로그 | 무엇을 보는가 |
|---|---|---|
| Web Server | Nginx/Apache access log | 요청 도착 여부, status, 응답 시간 |
| Web Server | Nginx/Apache error log | upstream 오류, TLS 오류, permission 오류 |
| WAS | catalina.out, server log | Tomcat 기동, 배포, Connector, JVM 오류 |
| Application | logback/log4j 등 | 비즈니스 예외, SQL 예외, 외부 API 오류 |
| DB | DB error/slow log | connection, lock, slow query |
| OS | journal, syslog/messages | service, OOM, disk, permission |
기본 진단 순서
- 사용자가 호출한 URL, 시간, 증상을 확인한다.
- Web Server access log에서 해당 요청이 있는지 본다.
- status code와 response time을 확인한다.
- Web Server error log에서 upstream/TLS/permission 오류를 본다.
- WAS access/application log에서 같은 시간대 흔적을 찾는다.
- 애플리케이션 예외와 DB 연결 오류를 확인한다.
- 필요하면 OS 리소스와 DB 상태까지 내려간다.
상태 코드별 접근
404
요청 경로를 찾지 못한 상태다.
| 확인 지점 | 예시 |
|---|---|
| Web Server path | Nginx location, Apache ProxyPass |
| rewrite | 경로가 바뀌고 있지 않은가 |
| WAS Context | /app, /admin, / 매핑 |
| 배포 파일 | ROOT.war, sample.war |
500
애플리케이션 내부 예외일 가능성이 높다.
| 확인 지점 | 예시 |
|---|---|
| application log | stack trace, business exception |
| DB | SQL exception, connection pool |
| 환경 설정 | env, secret, file path |
| 권한 | 파일/디렉터리 접근 권한 |
502
Web Server가 backend로부터 정상 응답을 받지 못한 상태다.
| 확인 지점 | 예시 |
|---|---|
| WAS process | Tomcat이 떠 있는가 |
| WAS port | 8080 listen 중인가 |
| upstream | proxy_pass 주소가 맞는가 |
| network | 방화벽, 보안 그룹 |
| timeout | WAS 응답이 너무 느린가 |
504
Web Server가 backend 응답을 기다리다 timeout난 상태다.
| 확인 지점 | 예시 |
|---|---|
| WAS thread | thread 고갈 |
| DB query | slow query, lock |
| external API | 외부 연동 지연 |
| timeout 설정 | proxy/read/connect timeout |
502, 503, 504를 실제 대응 순서로 좁힐 때는 502/503/504 장애 런북을 함께 본다.
명령어 예시
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
tail -f /var/log/httpd/access_log
tail -f /var/log/httpd/error_log
tail -f $CATALINA_BASE/logs/catalina.out
journalctl -u nginx -f
journalctl -u tomcat -f
포트와 프로세스 확인:
ss -lntp
ps -ef | grep tomcat
systemctl status nginx
systemctl status tomcat
시간 동기화
로그를 비교하려면 서버 시간이 맞아야 한다. Web Server, WAS, DB 서버의 시간이 어긋나면 같은 요청을 추적하기 어렵다.
timedatectl
chronyc sources
관련 블로그 기록
- 폐쇄망에서 서버 시간 맞추기 — 여러 서버 로그를 비교하기 위해 시간 동기화를 구성한 사례
- Tomcat Catalina.out 파일 용량 증가 문제 해결 — WAS 로그 파일이 장애 대응과 운영 비용에 영향을 준 사례
- WAS가 죽기 전에 로그 남기기 — 장애 후 분석을 위해 heap dump와 GC log를 남기도록 준비한 사례
닫기 전 질문
- Web Server access log에 요청이 남았는가?
- 같은 시간대 WAS/application log에는 어떤 흔적이 있는가?
- 상태 코드는 원인을 말해주는가, 아니면 원인을 좁히는 단서인가?