0%

[Java] Slf4j 로깅 프레임워크

개요

저번 시간에 System.out.println을 사용하면 안되는 이유에 대해서 조사하다가 로깅프레임워크가 궁금해져서 조금 더 조사해 보고, 정리하면 좋을 것 같아서 정리한다.
이번 평소에 아무런 생각없이 사용하던 slf4j 로깅 프레임워크에 대해서 알아보고, 어떤 장점과 특징이 있는지 알아보자.

용어

먼저, 용어 정리부터 시작하면 slf4j는 Simple Logging Facade for Java의 줄인말로, simple facede 나 다양한 로깅 프레임워크(java.util.logging, logback, log4j)의 추상화를 나타낸다. 그러니까 내가 모든 것들의 추상화! 내가 다 커버칠 수 있다? 정도로 이해하면 될 듯하다.

참고로 facede이미지를 검색해 보면 건물 정면을 뜻한다. facede 패턴에서도 나왔듯이 하나의 gateway라고 생각하면 될 듯하다.

사용 방법

1
2
3
4
5
6
7
8
9
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");
}
}

일반 적으로 이렇게도 사용하지만 프로젝트에서 lombok를 사용하고 있다면

1
2
3
4
5
6
@Slf4j
public class HelloWorld {
public static void main(String[] args) {
log.info("Hello World");
}
}

@Slf4j어노테이션이 다음과 같이 만들어 준다.

1
2
3
4
5
6
7
8
9
 @Slf4j
public class LogExample {
}

will generate:
public class LogExample {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}

기본 적인 사용 패턴

기본적으로 사용하는 패턴은 {} placeholder를 사용한다.

1
2
3
4
5
6
7
8
public class Person {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
String name = "andrew";
int age =32;
logger.info("My name is : {}, age: {}", name, age);
}
}

메뉴얼에 아주 재미있는 글이 있어서 가져왔다.

“What is the fastest way of logging?”

대략 설명하자면, 저렇게 parameterized message 형태로 넘기지 않고 직접 하나의 문자열로 표현하게 되면, logging을 하든 말든 문자열을 합산하는 비용이 발생하는데, parameterized message 형태로 넘기게 되면 로깅여부를 먼저 평가하고 긍정적인 경우에만 로거가 메세지를 형식화 하고 {}쌍을 문자열 값 항목으로 대체한다고 한다.

MDC support

mdc는 들어는 봤지만 정확히 알고 넘어간 개념은 아니었다. mapped diagnostic context로 로깅 프레임워크를 통해서 유지 관리 되는 map(key-value쌍)이라고 생각하면 된다. 그럼 이게 어디에 좋을까? map이라는 자료구조를 보면 알겠지만, 특정 key값으로 데이터를 get할때 시간 복잡도가 1이다. 해당하는 key값에 매핑되는 value값은 딱 그거 하나 뿐이니까.
그러면 로깅에서 이런 map이 무엇이 좋을까? 어떤 특정한 trigger나 filter를 하는 상황에서 로그를 가져올 수 있기 때문에 매우 유용하다. (직접 사용은 해보지 않았다)

기본 로깅 프레임워크가 MDC기능을 지원하면(현재, log4j, logback은 지원함) Slf4j는 해당 MDC기능을 기본 로깅 프레임워크에 위임한다. 기본 로깅 프레임 워크가 제공하지 않으면 Slf4j는 MDC 데이터는 저장하지만, 사용할려면 유저가 직접 코드를 작성해야 한다.

더 자세한 건 MDC 메뉴얼

Welcome to my other publishing channels