Search

SLF4J에 대해서 알아보자!

 SLF4J란 무엇일까?

SLF4J는 다양한 로깅 프레임워크에 대한 추상화 역할을 합니다. 추상 레이어를 제공하는 인터페이스 모음이라고보면 될 것 같습니다. 그런데 왜 추상화를 해야 할까요? 변경에 대해 자유롭기 때문이라 생각합니다. 즉, 추상화가 되어 있으면 개발자가 배포 시 원하는 로깅 프레임워크를 사용할 수 있습니다.

 버전마다 어떻게 달라졌을까? (주요 변경사항)

SLF4J는 2005년 5월 1일 첫 릴리즈 이후로 2021년 8월 30일까지 활발하게 릴리즈되고 있습니다. 주요 변경사항 위주로 어떻게 달라졌는지 알아보도록 하겠습니다.
[1.6.0 이후] 바인딩 되는 로깅 프레임워크가 없으면 기본적으로 no-operation 구현으로 설정됩니다.
[1.7.0 이후] SDK 1.5가 필요하며 Logger 인터페이스가
[1.7.5 이후] 로거 검색 시간이 크게 개선되었습니다. 따라서 공식문서에서는 1.7.5 이상으로 마이그레이션하는 것을 추천하고 있습니다.
[1.7.9 부터] detectLoggerNameMismatch 속성을 true로 설정하면 자동으로 잘못 명명된 로거를 찾아낼 수 있습니다.
[2.0.0 이후] Java 8이 필요하며, 이전 버전과 호환되는 API가 되입되었습니다. 사용자가 흐름 로깅 API의 이점을 얻기 위해 기존 로깅 프레임워크를 변경할 필요가 없습니다. ServiceLoader 매커니즘에 의존합니다.

 어떻게 사용하면 될까?

바닐라 자바와 롬복과 함께 사용하는 두 가지 방법이 있습니다. 후자를 선택하면 좀 더 편하게 사용할 수 있습니다. 현재 프로젝트에서 롬복을 사용하고 있다면 후자를 추천드립니다. 예제를 통해 이 두 가지 방법의 차이에 대해서 알아보도록 하겠습니다. 또 로그 내용은 어떻게 작성하면 되는지 함께 알아보도록 하겠습니다.

 바닐라 자바로 로그 작성하기

바닐라 자바로 로그를 작성하는 코드는 아래와 같습니다. 로깅 프레임워크 종류에 따라 조금씩 다른 점을 확인할 수 있습니다. 이렇게 되면 어떤 불편함이 있을까요? 변경하려고 하면 모든 곳에 같은 코드로 동기화해줘야 하는 불편함이 있습니다.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
Java
참고로 아래 코드와 같이 현재 디버그 모드가 활성화 되었는지 확인할 필요가 없습니다. 자체적으로 확인하고 있기 때문입니다.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); if (logger.isDebugEnabled()) { logger.debug("Hello World"); } } }
Java

 롬복과 함께 로그 작성하기

import lombok.extern.slf4j.Slf4j; @Slf4j public class HelloWorld { public static void main(String[] args) { logger.info("Hello World"); } }
Java

 로그 내용 작성하기

기존 자바 코드처럼 문자열을 +연산자로 이어붙일 필요가 없습니다. 아래 코드와 같이 중괄호를 활용하면 각 중괄호에 데이터가 바인딩됩니다.
import lombok.extern.slf4j.Slf4j; @Slf4j public class HelloWorld { public static void main(String[] args) { logger.info("My name is {}!!", "hyojae"); } }
Java

참고 자료