반응형
- 로깅(logging)이란 애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간 순으로 기록하는 것을 의미
로깅은 개발 영역 중 → 비기능 요구사항에 속함
- 사용자나 고객에게 필요한 기능은 아니라는 의미
- 하지만 로깅은 디버깅하거나 개발 이후 발생한 문제를 해결할 때 원인을 분석하는데 꼭 필요한 요소
자바 진영에서 가장 많이 사용되는 로깅 프레임워크
Logback
- log4j 이후에 출시된 로깅 프레임워크로서 slf4j를 기반으로 구현됐으며, 과거에 사용되던 log4j에 비해 월등한 성능을 자랑
- spirng-boot-starter-web 라이브러리 내부에 내장돼 있어 별도의 의존성을 추가하지 않아도 사용할 수 있다.
Logback 특징
- 5개의 레벨 로그(TRACE, DEBUG, INFO, WARN, ERROR)
- ERROR → 애플리케이션의 작동이 불가능한 경우
- WARN → 시스템 에러의 원인이 될 수 있는 경고 레벨 의미
- INFO → 애플리케이션의 상태 변경과 같은 정보 전달
- DEBUG → 애플리케이션의 디버깅을 위한 메시질르 표시하는 레벨 의미
- TRACE → DEBUG 레벨보다 더 상세한 메시지 표현
- 로그 파일 압축 가눙
- 보관 기능 설정해서 관리 가능
Logback 설정
- 스프링 부트는 logback-spring.xml 파일 참조

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./logs"/>
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${LOG_PATH}/info.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info_${type}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<!-- TRACE > DEBUG > INFO > WARN > ERROR > OFF -->
<!-- Root Logger -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="INFO_LOG"/>
</root>
</configuration>
- 3번째 줄 → Property영역
- 6~13, 15~28 → Appender 영역
- 10~12, 25~27 → Encoder 영역
- 11,26 → Patteren 영역
- 32~35 → Root 영역
Appender
- 이 영역은 로그의 형태 설정하고 어떤 방법으로 출력할지 설정하는 곳
- Appender 자체는 하나의 인터페이스를 의미하며 하위에 여러 구현체가 존재

로깅 구현체 초기화?

- JVM 구동 & 클래스 로딩
- spring-boot-starter-logging 의존성 로드

- SLF4J → 구현체 바인딩
- LoggerFactory.getLogger가 처음 호출되면 SLF4J가 StaticLoggerBinder를 통해 Logback의 LoggerContext를 생성

- Spring boot 초기 로깅 설정
- LoggingApplicationListener 실행
- 환경(application.yml/properties) 읽기 전 임시 콘솔 로거 세팅 (부팅 로그가 이때 찍힘)

- Environment 구성
- application.properties / application.yml 로드
- 로깅 시스템 재초기화
- logback-spring.xml(또는 logback.xml) 찾기
- JoranConfigurator로 XML 파싱 → LoggerContext 재구성:
- Appender(ConsoleAppender, FileAppender, RollingFileAppender 등)
- Encoder(PatternLayoutEncoder)
- Logback Filter(ThresholdFilter, LevelFilter 등)
- logger 레벨, logger 계층 구조
Http 요청 처리 - logger 실행?

- 서블릿 컨테이너 구동(내장 Tomcat 시작)
- 클라이언트 요청 수신
- 요청이 Servlet Filter 체인을 거침 (Spring Security, CORS, 로깅용 Filter 등)
- 여기서 logger.info(..) 호출 시:
- SLF4J Logger → Logback Logger 전달
- LoggerContext에서 연결된 Appender 호출
- Appender 내부 Logback Filter로 이벤트 필터링
- Encoder로 문자열 변환
- Console/File/RollingFileAppender로 출력
- DispatcherServlet → Controller
- Controller나 Service, 예외 처리 핸들러에서도 logger.debug(), logger.error() 호출 시 위와 동일하게 Appender 구조 실행
logger 동작 순서?
책에서 나온 그림은 logger 호출 이후 동작을 말하는 것
즉, filter의 의미는 spring 동작 흐름의 servlet filter가 아니라 filter는 로그 이벤트가 Appender로 전달되기 전에, 출력 여부를 결정하는 Logback 전용 필터 == logger를 부르면

Logback 적용
- 2가지 방법
public class GetController {
private final Logger LOGGER = LoggerFactory.getLogger(GetController.class);
@Slf4j
public class GetController {
}
- 사용
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String getHello(){
LOGGER.info("getHello 메서드가 호출되었습니다.");
return "Hello World";
}

결과

반응형
'Spring Boot > API를 작성하는 다양한 방법' 카테고리의 다른 글
| [Spring boot] REST API 명세 문서화 (0) | 2025.08.14 |
|---|---|
| [Spring boot] DELETE API 만들기 (0) | 2025.08.14 |
| [Spring boot] PUT API 만들기 (0) | 2025.08.14 |
| [Spring boot] POST API 만들기 (3) | 2025.08.14 |
| [Spring boot] GET API 만들기 (1) | 2025.08.14 |