
1. 로드의 개요
- 실행되는 동안 남긴 로그 기옥은 애플리테이션의 정확한 상황과 상태 정보를 제공합니다.
1.1 로깅 라이브러리
- 로그는 애플리케이션이 실행되는 동안 버그나 성능에 관한 통계 등의 정보를 전달하는 역할을 합니다.
- 필요한 정보를 직접 로깅하거나, 문제의 원인을 파악할 수 있는 다양한 로깅 라이브러리를 제공합니다.
로깅 라이브러리 유형
| 유형 | 설명 |
| java.util.logging | 자바에서 기본으로 제공하는 로깅 패키지 |
| Log4j | 2015년에 개발이 중단된 가장 오래된 로깅 라이브러리 중 하나 |
| Logback | Log4j 이후 출시되었으며, 스프링 부트의 spring-boot-starter-logging에 기본 포함됨 |
| Log4j2 | 가장 최근에 등장했으며 Logback과 유사한 기능을 가짐 (Java 7 이상 동작) |
로그 레벨 유형
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
| 레벨 | 설명 |
| FATAL | 조기 종료를 유발하는 아주 심각한 오류 |
| ERROR | 런타임 오류 또는 예상치 못한 에러 상황 |
| WARN | 실행에는 문제없으나 향후 발생할 수 있는 잠재적 문제에 대한 경고 |
| INFO | 시작/종료와 같은 런타임 이벤트 정보 (일반적인 정보 확인용) |
| DEBUG | 개발 단계에서 시스템 흐름을 파악하기 위한 상세 정보 |
| TRACE | 가장 상세한 로그 레벨로 최하위 수준의 정보 출력 |
1.2 SLF4J와 로깅 라이브러리
- SLF4J는 다양한 로깅 라이브러리를 통일된 방식으로 사용할 수 있게 해주는 추상 인터페이스입니다.
- SLF4J를 사용하면 코드 수정 없이 라이브러리만 교체하여 로그를 관리할 수 있습니다.
- Lombok의 @Slf4j 애너테이션을 사용하면 별도의 로깅 선언 코드 없이 바로 log 객체를 사용할 수 있습니다.

// SLF4J의 로그 레벨 동작 예
@Controller
public class Example01Controller {
@GetMapping("/exam01")
public String requestMethod(Model model) {
Logger logger = LoggerFactory.getLogger(Example01Controller.class);
logger.trace("Trace 메시지!");
logger.debug("Debug 메시지!");
logger.info("Info 메시지!");
logger.warn("Warn 메시지!");
logger.error("Error 메시지!");
model.addAttribute("data", "Slf4j로 로그 출력하기")
return "viewPage";
}
}
// Slf4j를 이용한 로그 레벨 동작 예
@Slf4j
@Controller
public class Example02Controller {
@GetMapping("/exam02")
public String requestMethod(Model model) {
log.trace("Trace 메시지!");
log.debug("Debug 메시지!");
log.info("Info 메시지!");
log.warn("Warn 메시지!");
log.error("Error 메시지!");
return "viewPage";
}
}
2. Log4j2를 이용한 로그 기록
2.1 Log4j2의 개요
- 자바로 작성되어 안정적이고 신속하며 유연합니다.
- 보안 취약점을 개선하여 로깅기능 강화시킨것으로 멀티스레드 환경에서 성능향상
- 로그 메시지의 더 나은 파라미터화
- 로그 이벤트에 더 많은 메타데이터 제공
- 로깅의 유연성과 확장성을 증가
스프링 부트 기본 로거인 Logback과 충돌을 방지하기 위해 기본 로거를 제외하고 Log4j2 의존성을 추가해야 합니다.
configurations {
all {
// Log4j2와의 충돌 방지를 위해 기본 로거 삭제
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
dependencies {
// Log4j2 의존성 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}
2.2 Log4j2 구조
Log4j2는 크게 세 가지 요소로 구성됩니다:
Logger: 로그 기록을 수행하는 핵심 모듈.
- Logger는 로그 작업을 수행하는 핵심 요소로, 로그 레벨과 Appender 설정을 통해 출력 대상과 위치를 결정합니다.
- Root Logger: <Root> 요소로 정의하며, 일반적인 로그 설정의 기본이 됩니다.
- 일반 Logger: <Logger> 요소로 정의하며, 특정 패키지나 클래스별로 다른 설정을 적용할 수 있습니다.
<Configuration>
<Loggers>
<Logger name="com.springboot" level="DEBUG" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
Appender: 로그가 출력될 위치(콘솔, 파일, DB 등)를 결정.
- <Console>: 콘솔에 출력.
- <File>: 특정 파일에 계속 기록.
- <RollingFile>: 파일 크기나 날짜에 따라 백업 파일을 생성하며 기록.
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %5p [%c] %m%n"/>
</Console>
<File name="file" fileName="./logs/file/sample.log" append="false">
<PatternLayout pattern="%d %5p [%c] %m%n"/>
</File>
<RollingFile name="rollingFile" fileName="log.log" filePattern="log.%i.log">
<PatternLayout pattern="%d %5p [%c] %m%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="15MB"/> <TimeBasedTriggeringPolicy interval="1"/> </Policies>
<DefaultRolloverStrategy max="3" fileIndex="min"/> </RollingFile>
</Appenders>
Layout: 로그의 출력 형식을 결정 (주로 PatternLayout 사용).
<PatternLayout pattern="%d{HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %msg%n" />
// 로깅 실전 코드 (Lombok @Slf4j 활용)
// Lombok의 @Slf4j를 사용하면 별도의 로거 생성 코드 없이 편리하게 로그를 남길 수 있습니다.
@Slf4j
@Controller
public class Example02Controller {
@GetMapping("/exam02")
public String requestMethod2(Model model) {
log.trace("Trace 메시지!");
log.debug("Debug 메시지!");
log.info("Info 메시지!");
log.warn("Warn 메시지!");
log.error("Error 메시지!");
model.addAttribute("data", "@Slf4j로 로그 출력하기");
return "viewPage";
}
}
3. 인터셉터를 이용한 로그 기록
- 특정 URL 을 요청할 때 컴트롤러로 가는 요청을 가로챈 뒤 특정 작업을 처리하는 것
3.1 인터셉터
- 사용자가 URL을 요청하면 컨트롤러에 요청이 들어가기 전(또는 응답하기 전)에 가로채어 특정 작업을 수행합니다.
주요 기능:
- 응답 페이지를 출력하기 전에 서버에서 데이터를 미리 가져오는 기능
- 폼에서의 제출(submit) 중복을 막는 기능
- 요청이 처리되기 전에 파일을 업로드하는 기능
- 각 요청에 대한 상세 내역을 기록하는 기능
- 유효성을 검사하는 기능
- 시간별 동작 및 성능의 병목 지점을 검사하는 기능
3.2 HandlerInterceptor로 로그 기록
인터셉터의 주요 메서드 및 동작 시점
- preHandle(): 컨트롤러가 호출되기 전 실행됩니다. false 반환 시 이후 과정은 실행되지 않습니다.
- postHandle(): 컨트롤러가 정상 처리된 후, 뷰로 전달되기 전 실행됩니다.
- afterCompletion(): 뷰 전송이 완료된 후, 즉 모든 처리가 끝난 후 실행됩니다.
// 인터셉터 클래스 구현 (ExampleInterceptor.java)
package com.springboot.controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.method.HandlerMethod;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ExampleInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle() 호출......");
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
log.info("핸들러 메서드명 : " + method.getMethod().getName());
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception {
log.info("postHandle() 호출......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion() 호출......");
}
}
// 인터셉터 등록 설정 (LoggingConfig.java)
// 작성한 인터셉터를 스프링 빈으로 등록해야 작동합니다.
package com.springboot.config;
import com.springboot.controller.ExampleInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class LoggingConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 인터셉터를 등록함
registry.addInterceptor(new ExampleInterceptor());
}
}
4. [도서 쇼핑몰] 로그 기록 만들기
- Log4j2로 콘솔에 로그 기록하기
- 인터센터로 모든 요청 URL의 콘솔 및 파일에 로그 기록하기
- 인터셉터로 특정 요청 URL의 콘솔 및 파일에 로그 기록하기
출처 : 송미영, 『 스프링부트 완전정복: 개념부터 실정 프로젝트까지 』길벗캠퍼스 (2024).
'DEVELOPMENT > Spring' 카테고리의 다른 글
| [스프링부트 완전정복] 13. RESTful 웹 서비스 (0) | 2025.12.30 |
|---|---|
| [스프링부트 완전정복] 11. 예외 처리 (0) | 2025.12.30 |
| [스프링부트 완전정복] 10장. 시큐리티 처리 (0) | 2025.12.16 |
| [스프링부트 완전정복] 9. 유효성 검사 (0) | 2025.11.21 |
| [스프링부트 완전정복] 8. 다국어 처리 (1) | 2025.11.15 |