로그는 반드시 필요한 내용만!

📌 로그에 대한 문제점

System.out.println()의 문제점

어떤 사례가 있나?

5000명의 사용자가 요청할 때, 모두 System.out.println()으로 로그를 처리하도록 되어 있었다. 그러나 이 한 줄을 지우고 응답 시간은 20초에서 6초로 줄어드는 효과가 있었다.

왜 이런 영향을 미칠까?

완전히 프린트되거나 저장될 때까지 뒤에서는 대기하는 시간이 발생한다. 이러한 대기 시간은 서버 디스크의 RPM이 높아야 처리속도가 높아짐으로, 시스템의 속도에 의존적이다.
System.out.println()은 개발할 때만 사용되는 것이 아닌가 생각해보면 된다. 의미 없는 디버그용 로그를 프린트하기 위해 아까운 서버의 리소스와 디스크가 낭비된다.

어떻게 해야 할까?

의미없는 로그만 제거하는 작업만 하더라도 성능을 향상시킬 수 있다.
시스템 로그를 무조건 제거하자.

스택 정보를 확인 시 문제점

어떤 문제점이 있을까?

예외가 발생하면 스택 정보를 확인하는데 콘솔에 찍힌 이 로그는 데이터가 섞여 알아보기 힘들다.
최대 100개까지 프린트하기 때문에 서버 성능에도 많은 부하를 준다.
스택 정보를 가져오는 부분에서 90% 이상이 CPU를 사용하는 시간이라 나머지 프린트 하는 부분에서 대기하는 시간이 발생한다.

어떻게 해야 할까?

예외 클래스에서 원하는 스택 정보를 가공하는 것도 좋은 방법이다.
필요하지 않은 부분들은 걸러서 원하는 부분만 가공하자. 이로 인해서 가독성도 올라가고, 깔끔하게 로그를 정리할 수 있다.

📌 자바에서 로그 처리하기

sl4j

간단히 로그를 처리해 주는 프레임워크이다.
문자열에 중괄호를 넣고 차례대로 데이터를 전달하면 문자열을 더하는 연산이 필요없다.
logger.info("My name is {}.", "hyojae kim");
Java
자바 기본 로거, Log4j, 아파치 commons 로깅 등과 연계해서 사용할 수 있다.

LogBack

예외 스택 정보를 출력할 때, 해당 클래스가 어떤 라이브러리를 참고하고 있는지 제공하기도 한다. 따라서 클래스와 관련된 정보를 알 수 있다.

📌 적용할 점

시스템 로그는 절대로 사용하지 말자.
로그도 불필요한 부분은 필터링하자.
꼭 필요한 곳에 로그를 남기자.
무언가 예측되지 않은 예외에 대해 처리할때는 디버깅에 도움되는 로그를 남기자.
모든 예외에 대해 기계적으로 error 로깅을 남기지 말자.
로그를 남겨야 할때 텍스트 포맷, 로깅레벨 등을 고민하지. (stack trace 같은 디버깅에 필요한 것들을 생각하라)

📌 참고 자료

TOP