로깅을 위한 퍼사드(프록시) 라이브러리
: 로깅 시스템에 대한 인터페이스를 제공하여 코드가 특정 로깅 라이브러리에 의존하지 않고 로깅을 수행할 수 있도록 도와준다.
로깅은 파일, 콘솔 등 출력을 유연하게 관리하고, 오류 디버깅 및 시스템 동작 추적에 도움을 주는 반면, System.out.println()은 간단한 출력용으로 사용되어 제어와 유연성 면에서 한계가 있다.
로깅은 더 많은 유연성, 제어력, 디버깅 및 관리 용이성을 제공하기에, 실제 애플리케이션 개발 및 운영에 적합하다.
| 특징 | 로깅 | System.out.println() |
|---|---|---|
| 출력 형식 지정 가능 | 가능 | 제한적 |
| 로그 레벨 및 필터링 | 로그 레벨을 설정하여 관리 | 레벨별로 로그 출력 x, 모든 출력을 일괄적으로 처리 |
| 로그 위치 설정 | 파일, DB, 네트워크 등 위치 설정 가능 | 콘솔에만 출력 가능 |
| 로그 성능 | 로그 레벨에 따라 출력을 조절하여 성능 향상에 도움 | 레벨 설정 및 성능 향상에 한계 |
| 유지보수 및 관리 용이성 | 설정을 통해 동작 변경 및 관리 용이 | 유연성 및 관리 용이에 한계 |
추상화된 인터페이스
: 로깅 시스템에 대한 추상화된 인터페이스를 제공하여, 코드가 특정 로깅 라이브러리에 의존하지 않고 로깅을 수행하게 되어 코드의 유연성이 높아진다.
다양한 로깅 백엔드 지원
: Logback, Log4j, JUL(Java Util Logging) 등 다른 로깅 프레임워크를 유연하게 사용할 수 있다.
간편한 로깅
: SLF4J-API를 활용하여 간단하고 명료한 방식으로 로깅 코드를 작성할 수 있다.
유연한 로깅 레벨 조정
: SLF4J를 통해 로깅 레벨을 설정하여, 중요도에 따라 세밀한 조절이 가능하다.
메시지 형식화
: 로그 메시지를 형식화할 수 있는 기능을 제공하여, 변수를 사용하거나 특정 형식으로 메시지를 출력할 수 있다.
유지보수 용이성
: 코드에서 특정 라이브러리에 대한 직접적인 의존성이 줄어들어 로깅 라이브러리를 변경하거나 업그레이드하는 데 용이하다.
SLF4J와 다른 로깅 프레임워크 간의 연결
SLF4J가 자체적으로 로깅을 처리하지 않고,
다른 로깅 시스템으로의 연결(redirect)을 위한 다리 역할을 하는 Bridge를 제공한다.
| 로그 레벨 | 출력 메서드 | 설명 |
|---|---|---|
| TRACE | trace() | 세분화된 정보 이벤트 지정 |
| DEBUG | debug() | 애플리케이션을 디버그하는 데 가장 유용한 세분화된 정보 지정 |
| INFO | info() | 대략적인 수준에서 응용 프로그램의 진행 상황을 강조하는 정보 지정 |
| WARN | warn() | 프로그램 실행에는 문제가 없지만, 잠재적으로 위험이 될 상황을 지정(경고성 메시지) |
| ERROR | error() | 어떠한 요청을 처리하는중 문제가 발생한 상태 |
| FATAL | X | 응용 프로그램이 중단될 수 있는 매우 심각한 오류 |
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LogTest {
private static final Logger logger = LogManager.getLogger(LogTest.class);
public void LogTest() {
//TRACE 레벨의 로그 기록
logger.trace("TRACE 레벨의 로그입니다.");
//DEBUG 레벨의 로그 기록
logger.debug("DEBUG 레벨의 로그입니다.");
//INFO 레벨의 로그 기록
logger.info("INFO 레벨의 로그입니다.");
//WARN 레벨의 로그 기록
logger.warn("WARN 레벨의 로그입니다.");
//ERROR 레벨의 로그 기록
logger.error("ERROR 레벨의 로그입니다.");
//FATAL 레벨의 로그 기록
logger.fatal("FATAL 레벨의 로그입니다.");
}
}
Bridge를 통해 SLF4J와 실제 로깅 시스템을 구현하는 구현체
SLF4J를 사용하여 로깅을 수행할 때, 실제 로깅 시스템으로의 연결을 위해 Binding이 필요하다.
SLF4J-API를 구현한 클래스에서 Binding으로 연결될 로깅 시스템에 로그 메시지를 전달하고 처리한다.
이 때, 하나의 API에 하나의 Binding을 두어야 한다.
로깅 시스템을 변경하거나 업그레이드할 때 발생할 수 있는 번거로움, 불필요한 동작을 줄일 수 있다.
즉, SLF4J를 사용함으로써 로깅 시스템에 대한 의존성을 낮추고, 애플리케이션의 로깅 코드를 로깅 시스템과 분리함으로써
나중에 로깅 시스템을 변경할 때 생기는 번거로움을 최소화할 수 있다.
그리고 다양한 로깅 시스템에서 SLF4J의 인터페이스를 구현한 Binding을 통해 쉽게 전환할 수 있다.
| 특징 | SLF4J | Log4j |
|---|---|---|
| 종류 | 로깅 추상화 인터페이스 | 로깅 시스템 |
| 역할 | 로깅 시스템에 대한 추상화된 인터페이스 제공 | 로그 기능 제공 |
| 주요 기능 | 로깅 시스템 간의 일관된 인터페이스 제공 | 다양한 로깅 기능 제공(로그 레벨, 출력 형식 등) |
| 기능 확장성 | 다양한 로깅 시스템과의 호환성, 유연한 기능 확장 | 풍부한 기능 제공, 확장성 높음 |
| 보안 취약점 | 보안 취약점 자체는 없지만, 로깅 시스템에 따라 보안 노출 가능성이 있음 | Log4j 2.x 버전에서 보안 취약점 발견 |
| 사용 방식 | 로깅 시스템을 추상화하여 다른 시스템과의 호환성을 높임 | 로깅 기능을 직접 제공 및 사용함 |
잘못된 정보가 있다면 댓글로 알려주세요!!
잘 보고 갑니다 ^^