본문 바로가기

우아한테크코스/프로젝트

Logback 이해하기

팀 프로젝트에서 Logback을 학습해서 적용하고 내가 이해한 내용을 팀원들에게 공유하기 위해 github Wiki에 작성했던 글을 옮긴 포스팅이다.

편한 팀원들에게 안쓰던 존댓말을 쓰면서 글을 작성하려다보니 말투가 조금 이상해졌다.😏


로깅을 도와주는 라이브러리

로깅을 도와주는 대표적인 라이브러리는 log4j, log4j2, logback 가 있어요.

나온 순서는 log4j -> logback -> log4j2 입니다. 최신에 나온 라이브러리일수록 앞선 라이브러리의 단점을 보완해서 더 좋은 성능과 기능을 제공합니다.

요즘 웬만한 프로젝트는 logback을 사용하고 저희 프로젝트에서도 logback을 사용합니다.

왜 log4j와 log4j2가 아닌 logback을 선택했을까요?

logback은 우선 앞서 언급했던 log4j를 토대로 새롭게 만든 Logging 라이브러리 입니다.

토대로 만들었다는 것은 단점을 보완했다는 뜻이겠죠?

log4j의 단점을 많은 부분에서 보완한 logback을 사용하지 않을 순 없습니다. 그러면 logback보다 더 좋을 수 있는 log4j2는 왜 사용하지 않았냐는 의문이 들 수 있습니다.

그 이유는 먼저 log4j2는 가장 최근에 나왔기 때문에 검색 가능한 자료의 양이 logback에 비해 상당히 적습니다. 그래서 프로젝트에 쉽고 빠르게 적용하고 서비스 운영 시 로깅에 문제가 생겼을 때 비교적 쉽게 해결할 수 있는 logback을 선택했습니다.


Logback의 장점

log4j의 단점들을 보완한 logback의 장점을 몇 가지 나열하겠습니다.

  1. log4j보다 약 10배 정도 빠르게 수행되도록 내부가 변경되었으며, 메모리 효율성도 좋아졌다.
  2. 문서화가 잘 되어 있다.
  3. 설정 파일을 변경하였을 경우, 서버 재가동 없이 변경 내용이 자동으로 갱신된다.
  4. 서버 중지 없이 I/O Faliure에 대한 복구를 지원한다.
  5. RollingFileAppender를 사용할 경우 자동적으로 오래된 로그를 지워주며 Rolling 백업을 처리한다.

크게 와닿지는 않네요. 장점들은 사용하면서 느껴봅시다.


Logback 설정 적용

이제 Logback을 적용하기 위한 방법들을 천천히 설명하겠습니다.

이 Logback은 별도의 의존성을 추가해주지 않아도 됩니다!

spring-boot-starter-web 안에 spring-boot-starter-logging에 구현체가 있거든요.

다만 설정 파일을 추가해줘야 합니다.

SpringBoot에서 설정 파일을 읽어오는 프로세스는 다음과 같은데요.

  1. classpath(resources디렉토리 밑)에 logback-spring.xml파일이 있으면 설정 파일을 읽어간다.
  2. logback-spring.xml파일이 없다면 .yml(.properties)파일의 설정을 읽어간다.
  3. logback-spring.xml파일과 .yml(.properties)파일이 동시에 있으면 .yml(.properties) 설정 파일을 적용 후 xml 파일이 적용된다.

제가 web 모듈의 resource 파일 안에 logback-spring.xml 파일을 추가해 둔 상태입니다.

제가 추가한 logback-spring.xml 설정 파일의 설명은 자바봄 블로그 비밥의 글에 너무 설명이 잘 되어있으니 이 글을 보는 게 제가 정리하는 것보다 좋을 것 같습니다.

설정 파일을 읽어오는 프로세스 3번을 보시면 yml 설정 파일과 xml 설정 파일을 동시에 적용할 수 있는데 yml이 우선 적용이라고 되어있죠?

logback-spring.xml에서 설정한 기본 설정과 별개로 yml 파일에 설정을 추가해줘서 패키지 별로 로깅 레벨을 지정해줄 수 있습니다. 아래와 같이요.

logging.level.com.songpapeople.hashtagmap=info
logging.level.com.songpapeople.hashtagmap.crawler=debug

로그 레벨

로그 레벨은 로그에 설정할 수 있는 레벨인데요. 이 레벨은 다섯 단계가 존재합니다.

  1. ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시한다.
  2. WARN : 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타낸다.
  3. INFO : 상태변경과 같은 정보성 로그를 표시한다.
  4. DEBUG : 프로그램을 디버깅하기 위한 정보를 표시한다.
  5. TRACE : 추적 레벨은 Debug보다 훨씬 상세한 정보를 나타낸다.

위의 순서대로 높은 레벨을 가지는 건데요. 출력 레벨을 설정하면 설정 레벨 보다 낮은 레벨의 로그는 무시합니다.

예를 들어 로깅 레벨 설정을 3순위인 INFO로 설정했다면 4순위 DEBUG와 5순위 TRACE의 로그는 무시되는 거예요.


Logback 사용

그래서 설정 된 logback을 사용하기 위해선 어떻게 해야될까요?

slf4j(simple logging facade for java) 를 사용하면 됩니다.

@Slf4j 많이 봤던 어노테이션일 거예요. lombok을 통해서 slf4j를 쉽게 사용할 수 있습니다.

slf4j는 facade 패턴을 적용한 로깅 프레임워크입니다.
facade 패턴은 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 것을 말합니다.
쉽게 말해서 slf4j는 로깅을 하기 위한 인터페이스이고 logback은 slf4j를 구현한 구현체입니다.

그래서 logback을 사용해서 로그를 찍기 위해선 @Slf4j 어노테이션을 달아주시고

log.info("info");

이렇게 사용해주면 됩니다.

Logger 객체에 많은 메서드들이 있고 매개 변수로 에러를 담을 수도 있으니 로그 레벨에 맞게 로그를 찍으면 됩니다.

여담으로 제가 리뷰받은 내용 중에 e.printStackTrace()로 자주사용하던 printStackTrace 메서드는 스택 트레이스를 리플렉션 기반으로 찾아오기 때문에 성능이 좋지않으니 slf4j를 사용하라는 리뷰가 있었습니다!


정리

  1. logback 라이브러리를 통해 로그를 콘솔에 찍거나 파일로 저장할 수 있다.(우리 서비스는 운영 환경에서는 파일로 저장하고 운영 환경이 아닐 땐 콘솔에 찍는다.)
  2. logback에 대한 설정은 web모듈의 resource파일 안에 logback-spring.xml 파일에 설정해뒀고 설정에 관한 자세한 내용은 위에 있는 비밥의 블로그글을 참고하자.
  3. logback-spring.xml 을 통해 한 설정과 별개로 yml 파일을 통해 패키지별로 로그레벨 설정을 다르게 줄 수 있다.(우리 서비스는 INFO로 되어있다. INFO보다 낮은 레벨은 무시)
  4. 설정한 logback을 통해 로그를 찍으려면 slf4j(Logger객체)를 사용하면 된다.