300===Dev Framework/Logback

Logback: 자바 최강 로깅 프레임워크 😎

블로글러 2024. 5. 28. 22:55

Logback은 자바 오픈소스 로깅 프레임워크로, SLF4J의 구현체이자 스프링 부트의 기본 로그 객체입니다. Log4j의 후속 버전으로 성능이 뛰어나며, 자동 리로딩, MDC, 파일 압축 등 다양한 기능을 제공합니다. 본 글에서는 Logback의 개념, A동작 방식, 설정 방법, 사용 예시를 구체적으로 살펴봅니다.

오늘은 자바 개발자라면 꼭 알아야 할 Logback에 대해 알아볼게요!

Logback이 뭔가요? 🤔

여러분이 매일 일기를 쓴다고 상상해보세요.

  • 오늘 있었던 일
  • 언제, 어디서 무슨 일이 있었는지
  • 중요한 일과 사소한 일을 구분해서

Logback은 바로 애플리케이션의 '디지털 일기장' 역할을 합니다!

  • 애플리케이션에서 발생하는 다양한 이벤트를 기록
  • 시간, 위치, 중요도에 따라 체계적으로 분류
  • 문제 발생 시 빠른 원인 파악을 도와주는 마법사 🧙‍♂️

Logback은 Log4j의 창시자인 Ceki Gülcü가 개발한 Log4j의 후속작으로, SLF4J의 구현체이자 스프링 부트의 기본 로깅 시스템입니다.

어떻게 동작하나요? 🎬

Logback은 크게 세 가지 핵심 구성요소로 이루어져 있습니다:

1. Logger (로거)

로그 메시지를 생성하는 주체로, 계층 구조를 가집니다.

// Logger 생성 예시
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

// 다양한 레벨의 로그 출력
logger.trace("가장 상세한 추적 정보");
logger.debug("디버깅 정보");
logger.info("일반적인 정보 메시지");
logger.warn("경고 메시지");
logger.error("오류 메시지");

2. Appender (어펜더)

로그 메시지를 어디에 출력할지 결정합니다.

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

  <!-- 파일에 출력하는 Appender -->
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/application.log</file>
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>
</configuration>

3. Layout/Encoder (레이아웃/인코더)

로그 메시지의 형식을 지정합니다.

<encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>

기본 설정 파일

Logback은 logback.xml 또는 Spring Boot에서는 logback-spring.xml 파일을 통해 설정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- 로깅 레벨 설정 -->
  <root level="INFO">
    <appender-ref ref="CONSOLE" />
  </root>

  <!-- 특정 패키지의 로깅 레벨 설정 -->
  <logger name="com.example.myapp" level="DEBUG" />
</configuration>

장점은? 🌟

  1. 뛰어난 성능 🚀
    • Log4j, JUL보다 빠른 처리 속도
    • 최소한의 리소스 사용으로 애플리케이션 영향 최소화
    • 비동기 로깅 지원으로 성능 향상
  2. 자동 설정 리로드 ♻️
    • 설정 파일이 변경되면 자동으로 감지하여 적용
    • 서버 재시작 없이 로그 레벨 변경 가능
    • 개발 중 빠른 디버깅을 위한 로그 설정 변경 용이
  3. MDC(Mapped Diagnostic Context) 🔍
    • 멀티스레드 환경에서 요청별 로그 추적 가능
    • 트랜잭션 ID를 통한 분산 시스템에서 로그 연결
    • 사용자 정보, 세션 ID 등 컨텍스트 정보 포함 가능
  4. 다양한 로그 저장 방식 📂
    • 콘솔, 파일, 데이터베이스, 원격 서버 등 다양한 출력 지원
    • 로그 파일 자동 압축 및 보관 기능
    • 로그 파일 순환(Rolling) 기능 내장

주의할 점 ⚠️

  1. 과도한 로깅은 성능 저하의 원인 🐢
    • 프로덕션 환경에서는 INFO 레벨 이상 사용 권장
    • 디버그 로그는 개발 환경에서만 활성화
      logger.debug("복잡한 계산 결과: " + expensiveOperation());
       
  2. 로그 파일 관리에 주의 📊
    • 로그 파일이 너무 커지지 않도록 RollingFileAppender 사용
    • 오래된 로그 파일 자동 삭제 정책 설정
    • 디스크 공간 모니터링 필요

실제 사용 예시 📱

1. Spring Boot에서 Logback 설정

Spring Boot는 기본적으로 Logback을 사용하며, application.properties 또는 application.yml로 간단히 설정할 수 있습니다.

# application.yml
logging:
  level:
    root: INFO
    com.example.myapp: DEBUG
  file:
    name: logs/application.log
    max-size: 10MB
    max-history: 30

더 복잡한: 설정은 logback-spring.xml 파일을 생성하여 사용합니다.

2. MDC를 활용한 로그 추적

@Component
public class MDCLoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            // 요청마다 고유 ID 생성
            String requestId = UUID.randomUUID().toString();
            MDC.put("requestId", requestId);

            // 사용자 정보 추가
            SecurityContext context = SecurityContextHolder.getContext();
            if (context.getAuthentication() != null) {
                MDC.put("userId", context.getAuthentication().getName());
            }

            chain.doFilter(request, response);
        } finally {
            // 필터 종료 후 MDC 정리
            MDC.clear();
        }
    }
}

로그 패턴에 MDC 정보 포함:

<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{requestId}] [%X{userId}] %-5level %logger{36} - %msg%n</pattern>

3. 로그 레벨별 파일 분리

<configuration>
    <!-- DEBUG 레벨 이상 로그를 모두 저장 -->
    <appender name="FILE-ALL" 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>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/archived/application.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- ERROR 레벨만 별도 파일에 저장 -->
    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/error.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="FILE-ALL" />
        <appender-ref ref="FILE-ERROR" />
    </root>
</configuration>

마치며 🎁

Logback은 자바 애플리케이션에서 로깅을 효율적으로 관리할 수 있는 강력한 도구입니다. 적절한 로깅은 개발 과정에서의 디버깅뿐만 아니라, 프로덕션 환경에서 문제 해결, 성능 모니터링, 보안 감사 등 다양한 목적으로 활용될 수 있습니다.

SLF4J와 함께 사용하면 로깅 구현체를 쉽게 교체할 수 있는 유연성도 갖추고 있어, 현대 자바 개발에서 가장 많이 선택되는 로깅 프레임워크입니다.

로깅은 개발자의 필수 기술이자 좋은 습관입니다. Logback으로 더 효율적인 로깅을 시작해보세요! 🚀


궁금하신 점 있으시다면 댓글로 남겨주세요! 😊

참고 자료

  1. Logback 공식 문서: https://logback.qos.ch/
  2. 강력한 자바 오픈소스 로깅 프레임워크, logback 사용법: https://jeong-pro.tistory.com/154
  3. Logback 으로 쉽고 편리하게 로그 관리를 해볼까요?: https://tecoble.techcourse.co.kr/post/2021-08-07-logback-tutorial/
  4. 아키텍처 설계: Logback을 활용한 Remote Logging: https://www.nextree.co.kr/p5584/
  5. Java 로깅 logger, log4j, logback, slf4j 비교: https://0soo.tistory.com/241
  6. [LOG] Log4j, LogBack 정리: https://goddaehee.tistory.com/45
728x90

'300===Dev Framework > Logback' 카테고리의 다른 글

Log4j Introduced  (0) 2024.05.28