이번에 작은 사건 사고를 겪으면서 로그를 꼭 남겨야겠구나....싶어서 로그에 대해 알아보던 중 회사 내에서 사용하고 있는 방법 중 @Slf4j 어노테이션을 통해 로그를 관리하고 있는 것을 확인 !
@Slf4j 어노테이션의 코드를 이해하기 위해 먼저 Slf4j와 로깅에 대해 공부해보려고합니다 !
❓로깅이란 ?
로깅은 프로그램 동작 시 발생하는 모든 일을 기록하는 행위 입니다. 모든 일이란 서비스 동작 상태와 장애로 나눌 수 있습니다. 서비스 동작 상태에는 시스템 로딩, HTTP 통신, 트랜잭션, DB 요청, 의도를 가진 Exception 등이 있고, 장애(exception, error)로는 I/O Exception, NullPointException, 의도하지 않은 Exception 등이 있습니다.
로깅은 다음과 같이 할 수 있습니다.
- System.out.println("로깅")
- System.err.println("에러로깅")
- 로깅 프레임워크를 사용(Slf4j, Logback, Lof4j 등)
📊로그 레벨
Logback은 6단계의 로그 레벨을 가집니다.
TRACE
가장 상세한 로그 레벨로, 애플리케이션의 실행 흐름과 디버깅 정보를 상세히 기록합니다. 주로 디버깅 시에 사용됩니다.
DEBUG
디버깅 목적으로 사용되며, 개발 단계에서 상세한 정보를 기록하며, 애플리케이션의 내부 동작을 이해하고 문제를 분석하는 데 도움을 줍니다.
INFO
정보성 메시지를 기록하며, 애플리케이션의 주요 이벤트나 실행 상태에 대한 정보를 전달합니다.
WARN
경고성 메시지를 기록하며, 예상치 못한 문제나 잠재적인 오류 상황을 알리는 메시지 입니다.
애플리케이션이 정상적으로 동작하지만 주의가 필요한 상황을 알려줍니다.
ERROR
오류 메시지를 기록하며, 심각한 문제 또는 예외 상황을 나타내고 애플리케이션의 정상적인 동작에 영향을 미칠 수 있는 문제를 알립니다.
FATAL
가장 심각한 오류 메시지를 기록합니다.
애플리케이션의 동작을 중단시킬 수 있는 치명적인 오류를 나타내며, 일반적으로 이러한 오류는 복구가 불가능하거나 매우 어려운 상황을 의미합니다.
❓Slf4j란 ?
Logging에 대해 알아봤으니 Slf4j에 대한 알아보도록 하겠습니다 !
Slf4j는 Simple Logging Facade for Java로 다양한 로깅 프레임워크(java.util.logging, logback 및 log4j)에 대한 추상화(인터페이스) 역할을 하는 라이브러리입니다.
인터페이스이기 때문에 단독으로 사용이 불가능하며, 최종 사용자가 배포 시 원하는 구현체(logback, log4j 등)를 선택하여 사용할 수 있습니다.
Slf4j의 동작 과정을 아래와 같습니다.
Bridge
Slf4j 이외의 다른 로깅의 API로의 Logger 호출을 Slf4j 인터페이스로 연결(redirect)하여 Slf4j API가 대신 처리할 수 있도록 하는 라이브러리이며, 이전의 레거시 로깅 프레임워크를 위한 라이브러리입니다.
Bridge는 여러 개를 사용해도 상관없지만, Bridge와 Binder에 같은 종류의 프레임워크를 사용하면 안됩니다.
Slf4j API(인터페이스)
로깅에 대한 추상 레이어(인터페이스)를 제공합니다. 즉, 로깅 동작에 대한 역할을 수행할 추상 메서드를 제공합니다.
사용 시 주의점은 반드시 하나의 API에 하나의 Binding을 둬야합니다.
Slf4j Binding(.jar)
Slf4j 인터페이스를 로깅 구현체(Logging Framework)와 연결하는 어댑터 역할을 하는 라이브러리입니다.
Slf4j API를 구현한 클래스에서 Binding으로 연결될 Logger의 API를 호출합니다.
Slf4j API처럼 하나의 API에 하나의 Binding을 둬야합니다.
예제 코드
// 라이브러리 추가(버전은 변경될 수 있습니다.)
// Gradle
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.24'
// Maven
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
@Slf4j
public class TestController {
@GetMapping("/")
public String String(String str){
try {
str.toString();
} catch (NullPointerException e){
log.trace("가장 디테일한 로그");
log.warn("경고");
log.info("정보성 로그");
log.debug("디버깅용 로그");
log.error("에러",e);
}
return "test";
}
}
⭐정리
로깅은 통신, 트랜잭션, DB를 통한 요청, Exception 등 동작을 했을 때의 기록을 남길 수 있는 것 !
Slf4j는 로깅의 역할을 대신 해주는 라이브러리다 !
로그를 남기는 것은 미래에 나를 위한 것이다 ! 라는 저의 오늘의 한마디와 함께 마무리하겠습니다 !
'프로그래밍 > Java' 카테고리의 다른 글
[Java, 자바] 예외 처리란 ? (0) | 2024.07.31 |
---|---|
[Java, 자바] 중첩 클래스와 내부 클래란 ? (1) | 2024.07.29 |
[Java, Spring] application.properties란 ? (0) | 2024.07.29 |
[Java, 자바] 날짜와 시간 클래스에 대하여 (0) | 2024.07.19 |
[Java, 자바] Enum에 대하여 (0) | 2024.07.16 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!