과도한 로깅
과유불급(過猶不及)
정도를 지나침은 미치지 못함과 같다
- 논어(論語) 선진편(先進篇)
방문자가 매우 많은 사이트에서 애플리케이션을 배포하는 작업은 부담이 크다. 다행히 애플리케이션 서버를 여러 대 두기 때문에 서버 한 대가 잘못되더라도 사이트 전면 장애가 발생하지는 않는다. 새로운 코드를 배포할 때는 항상 서버 한 대에 먼저 배포해 놓고 일정 시간 동안 모니터링 한다. 문제가 없는 경우에는 전체 서버로 배포하고, 로그에 예외나 에러가 표시되면 즉시 롤백한다.
문제는 모니터링을 하는데 로그가 너무 많이 표시된다는 점이다. 콘솔 화면에 에러 메시지와 스택 트레이스가 마구 지나가는데 동료들에게 이게 뭐냐고 물어보면 그냥 무시해도 된단다. 그냥 무시할 거면 로그에 남긴 이유가 무엇인가? 로그를 출력하는 코드를 살펴보면 대부분 try...catch
로 예외를 잡아 스택 트레이스와 에러 메시지를 로거에 쏟아내고 끝난다. 로그 메시지가 뭘 전달하려는 것인지 의도를 알 수 없다. 예외 상황을 어떻게 해결하는지 고민한 흔적은 보이지 않는다.
당장 쓰이지 않더라도 언젠가 문제를 해결할 때 큰 도움이 될 지도 모르니 일단 찍어 놓자? 내 생각에 불필요한 (또는 과도한) 로깅에는 다음과 같은 문제가 있다.
- 출력되는 로그 메시지 대부분이 문제 해결에 도움이 되지 않는다.
- 출력되는 로그 메시지가 너무 많아 정말 문제가 되는 부분을 찾기가 어렵다.
로그의 대부분이 잡음이라 의미있는 정보를 찾아내기가 매우 어려워 진다. 문제를 확인하려면 엄청난 양의 (대부분은 문제와 관련이 없을) 로그를 분석해야 한다. 문제 분석에 도움을 주려던 의도와 달리 오히려 문제 분석을 어렵게 한다는 말이다. 로깅으로 인한 성능 저하나 코드 가독성 저하, 로그 파일 저장 공간 문제 등은 (물론 중요하지만) 부차적 문제다.
중요 이벤트나 예외 상황에 대해 로그를 남겨두면 추후 문제를 분석할 때 큰 도움이 될 수 있다. 그러나 로그를 어느 수준으로 남길지, 무엇을 남길지 고민해야 한다. 예외가 발생하면 무조건 스택트레이스를 로그에 남겨야 하는가? 어떤 예외에 대해서는 코드 안에서 해당 예외에 적절히 대처할 수 있다. 이미 예상한 예외 상황이고 이에 대한 대처도 잘 되어 있다면 굳이 로그로 남길 필요가 있을까? 어떤 경우에는 로그를 남기지 않아도 상관 없을 것이다. 어떤 경우에는 간단한 메시지와 함께 해당 예외의 발생을 유발한 입력 값 정도만 로그로 남겨도 될 것이다. 스택 트레이스까지 남겨놓아야 문제를 빨리 파악할 수 있는 경우도 있을 것이다.
예외가 발생했다고 아무런 고민 없이 무조건 에러 메시지와 스택 트레이스만 찍어대는 수준이라면 별로 도움이 되지 않는다.
참고
- The Problem With Logging 이 글에서 제프 앳우드는 과도한 로깅이 오히려 문제를 유발할 수 있음을 지적하면서, 모든 것을 로깅하려 하지 말고 주의 깊게 꼭 필요한 것만 로깅하도록 권고한다.