무던하게

로깅(Logging)은 애플리케이션의 동작을 기록하여 디버깅, 문제 해결, 운영 모니터링 등을 돕는 필수적인 도구입니다. Spring Boot는 기본적으로 SLF4JLogback을 사용하며, 간단한 설정으로 강력한 로깅 기능을 제공합니다. 이 글에서는 실무에서 자주 사용되는 Lombok의 @Slf4j 활용을 시작으로, 로깅의 기본 구현, 로그 레벨 관리, Logback 설정, 그리고 실무에서의 모범 사례를 살펴봅니다.


1. Lombok @Slf4j 활용

실무에서는 Lombok@Slf4j 애노테이션을 사용해 Logger 객체를 간소화하는 방식이 널리 사용됩니다. Logger 객체를 직접 선언할 필요 없이 바로 log 객체를 사용할 수 있어 코드가 깔끔해집니다.

1) Lombok 의존성 추가

Maven

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

Gradle

implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

2) @Slf4j 사용 예제

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class UserController {

    public void signup(SignupRequest request) {
        log.info("[회원가입 시작] email={}", request.getEmail());

        try {
            userService.signup(request); // 비즈니스 로직
            log.info("[회원가입 성공] email={}", request.getEmail());
        } catch (Exception e) {
            log.error("[회원가입 실패] email={}, error={}", 
                request.getEmail(), e.getMessage(), e);
            throw e;
        }
    }
}

장점

  • Logger 객체 선언 불필요: @Slf4j로 Logger 객체 선언 없이 바로 log 객체를 사용할 수 있습니다.
  • 간결한 코드: 로깅 관련 코드가 더 깔끔해지고 유지보수가 용이해집니다.

2. Spring Boot에서 로깅 구현하기

Spring Boot는 기본적으로 SLF4J(Simple Logging Facade for Java)와 Logback을 사용해 로깅을 지원합니다. spring-boot-starter를 추가하면 별도의 설정 없이도 기본 로깅 기능을 사용할 수 있습니다.

기본 로깅 예제

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoggingController {

    private static final Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @GetMapping("/log")
    public String logExample() {
        logger.info("INFO: Logging example endpoint accessed");
        logger.debug("DEBUG: Detailed debug message");
        logger.warn("WARN: This is a warning message");
        logger.error("ERROR: This is an error message");
        return "Check your logs for log messages!";
    }
}

Spring Boot는 기본적으로 INFO 레벨 이상의 로그를 출력합니다. 위 코드를 실행하고 /log 엔드포인트에 접근하면 로그가 출력됩니다.


3. 로그 레벨 관리

Spring Boot에서는 로그 레벨을 설정하여 출력할 로그를 제어할 수 있습니다. 개발 환경과 운영 환경에 따라 적절한 로그 레벨을 설정하는 것이 중요합니다.

1) 로그 레벨의 의미

  • TRACE: 가장 상세한 로그. 디버깅용으로 사용.
  • DEBUG: 개발 중에 유용한 디버깅 정보.
  • INFO: 일반적인 실행 정보.
  • WARN: 잠재적인 문제.
  • ERROR: 오류 발생.

2) 로그 레벨 설정

로그 레벨은 application.properties 또는 application.yml에서 설정할 수 있습니다.

application.properties 예제:

# 전체 로그 레벨
logging.level.root=INFO

# 특정 패키지의 로그 레벨
logging.level.com.example=DEBUG
logging.level.org.springframework.web=ERROR

4. Logback 설정

Spring Boot는 기본적으로 Logback을 사용하며, logback-spring.xml 파일을 추가하여 로깅 동작을 커스터마이징할 수 있습니다. 아래는 자주 사용하는 콘솔 출력 및 파일 저장 설정 예제입니다.

logback-spring.xml

<configuration>
    <!-- 콘솔에 로그 출력 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 파일에 로그 저장 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/application.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 로그 레벨 설정 -->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

설명

  • ConsoleAppender: 로그를 콘솔에 출력합니다.
  • RollingFileAppender: 로그를 파일에 저장합니다.
  • <root level="info">: 기본 로그 레벨을 INFO로 설정합니다.

5. 실무에서의 로깅 모범 사례

  1. Lombok의 @Slf4j 활용

    • Logger 객체 선언을 생략하고 간결한 로깅 구현이 가능합니다.
  2. 환경별 로그 레벨 설정

    • 개발 환경에서는 DEBUG 또는 TRACE를 활성화하고, 운영 환경에서는 INFO 이상으로 제한합니다.
  3. 로그 파일 관리

    • 로그 파일은 너무 커지지 않도록 파일 분리(롤링)와 보존 정책을 설정합니다.
  4. 민감 정보 제외

    • 개인 정보나 보안 정보를 로그에 남기지 않도록 주의합니다.
profile

무던하게

@moodone

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!