1. 로그 (log) 란?
- 로그는 프로그램의 동작을 추적해 문제를 해결하거나 성능을 분석하기 위한 목적으로 활용된다.
- 스프링 부트는 기본적으로 로그백(Logback)이라는 로깅 도구를 사용하여 관리한다.
2. System.out.println()을 권장하지 않는 이유
2-1. synchronized로 인한 성능 저하
- System.out.println(); 내부는 아래와 같이 생겼습니다.
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
- synchronized는 자바에서 data에 대해서 thread-safe 를 위하여 여러 스레드가 동시에 접근하는 것을 금지하기 위해 사용합니다.
- 이 과정에서 다른 스레드들은 임계영역에 접근하지 못 하여 성능 저하가 발생할 수 있습니다.
- 또한 자바 내부적으로 메서드나 변수에 동기화를 위해 block과 unblock을 처리하게 되는데, 이러한 처리가 너무 많이 일어나면 오버헤드가 발생하여 성능저하로 이어질 수 있습니다.
2-2. 로그 레벨
- 로그 레벨은 아래와 같이 지정하여 로그 메시지의 중요도를 나타내는 역할을 합니다.
- System.out.println()은 로그 레벨에 따른 구분이 어려워집니다.
- trace : debug 보다 훨씬 상세한 정보를 기록할 경우에 사용 (주로 디버깅에서 사용)
- debug : 디버깅 목적으로 사용
- info : 주요 이벤트나 상태 등의 정보를 출력 목적으로 사용
- warn : 문제가 발생할 가능성이 있는 상태를 경고하는 정보 출력
- error : 심각한 문제나 예외 상황 등에 대한 오류 정보를 출력
- fatal : 프로그램 기능의 일부가 실패하는 등 아주 심각한 문제에 관한 정보 출력
2-3. 유지보수성
- 로그가 발생한 시간과 위치, 레벨 등을 출력해주지 않기 때문에 직접 인자로 넘겨주어야 한다.
- 메시지를 수정하거나 삭제하기 위해서는 인자를 계속해서 수정해야 한다.
2-4. 로그 내역 저장
- System.out.println()을 사용하면 로그를 저장하지 않고 출력만 하기에 추후에 로그를 확인하기가 어렵다.
3. logback
- SLF4J 구현체로 SpringBoot의 기본 log로 사용
- logback은 동기화가 불필요한 환경에서 성능 최적화를 위해 unsynchronized 하게 로그를 기록합니다.
4. 결론
- 스프링에서 지원하는 다양한 로깅 툴을 자신의 상황에 맞게 사용하자!
- 로그의 종류에 대해 알고 싶으시면 아래 포스트를 확인해주세요.
Spring 로그