Study/Java
[Logger] SLF4J 기초
black6765
2022. 12. 22. 22:28
개요
- Java의 로그 라이브러리에는 대표적으로 slf4j, log4j2(log4j), logback이 있다
- 여기서 slf4j는 인터페이스 역할, log4j2 / logback은 구현체 역할이라고 보면 된다
- slf4j를 활용하면 log4j2 <-> logback 간의 마이그레이션을 간단히 할 수 있다
- 인터페이스의 역할
- 일반적으로 slf4j에 logback 또는 log4j2 둘 중 하나를 사용한다
SLF4J(Simple Logging Facade For Java)
특징
- slf4j는 로깅에 대한 추상 레이어를 제공하는 인터페이스의 모음이다
- Facade 디자인 패턴이 적용되어 있다
- 구현 클래스를 사용자가 설정할 수 있다
SLF4J의 세 가지 모듈
1. SLF4J API
- SLF4J를 사용하기 위한 인터페이스를 제공한다
- slf4j-api-{version}.jar를 통해 사용한다
2. SLF4J Binding(2.0.0 버전부터 Provider)
- SLF4J 2.0.0 버전부터는 Binding이라는 용어가 Provider로 변경되었다.
- slf4j 바인딩은 하나만 사용해야 한다
- SLF4J 인터페이스를 로깅 구현체와 연결하는 역할
- SLF4J Binding의 종류
- slf4j-log4j12-{version}.jar
- log4j와 log4j2에 대한 바인딩
- log4j (log4j 1.x)에 대한 지원 중단
- log4j 1.x가 2015년에 EOL 되었고, 2022년 SLF4j 1.7.35부터는 log4j에 대한 것은 빌드 시 자동으로 slf4j-reload4j 모듈로 리다이렉션 됨
- log4j 1.x를 사용하고 싶다면 slf4j-reload4j를 사용하는 것이 좋음
- slf4j-reload4j-{version}.jar
- log4j 1.2.7의 대체
- slf4j-jdk14-{version}.jar
- JDK 1.4 로깅(java.util.logging)에 대한 바인딩/공급자
- logback-classic-{version}.jar + logback-core-{version}.jar
- Logback의 클래스는 SLF4J의 인터페이스를 직접 구현한 것
- version = 1.4.x : 구현체로 logback을 사용하고, Jakarta EE를 사용할 때의 바인딩
- version = 1.3.x : 구현체로 logback을 사용하고, Javax EE를 사용할 때의 바인딩
- slf4j-log4j12-{version}.jar
3. SLF4J Bridging Modules
- 다른 로깅 API로 로거를 호출할 때 SLF4J 인터페이스로 연결하여 대신 처리할 수 있도록 하는 역할
사용 예제(maven)
pom.xml
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
- slf4j에 대한 dependency를 추가
- pom.xml을 변경한 후에는 반드시 변경사항을 반영해주어야 한다
- 인텔리제이 기준 우측 상단의 “Load Maven Changes”을 클릭하거나 <Ctrl + Shift + O>를 입력
package org.example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private final static Logger logger = LoggerFactory.getLogger(Main.class);
public void doSomething() {
logger.info("Logging Something");
}
public static void main(String[] args) {
new Main().doSomething();
}
}
- slf4를 사용하여 로그 출력 시도
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See <https://www.slf4j.org/codes.html#noProviders> for further details.
- 이와 같은 오류 메시지가 출력되며 로깅이 되지 않는다
- SLF4J 2.0.0 버전 이상부터는 binding이라는 용어가 provider로 대체되었다
- 그 이유는 SLF4J는 인터페이스 역할이기 때문에 구현체가 필요하기 때문이다
- 이를 위해서는 SLF4J Binding jar 파일을 정확히 1개 두어야 한다
- 여기서는 logback에 대한 바인딩인 logback-classic을 사용하여 진행
pom.xml에 logback dependency 추가
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
- 예제에서는 1.4.5 버전을 사용
출력 결과
17:24:49.264 [main] INFO org.example.Main - Logging Something