Post

[Spring] 로그 관리하기 _ Logger

로거(Logger)는 애플리케이션의 실행 중에 발생하는 이벤트를 기록하는 도구이다. 로깅(Logging)은 이러한 이벤트를 시스템 콘솔, 파일, 네트워크 서버 등에 기록하는 프로세스를 말한다.

로거(Logger)가 필요한 이유

  1. 디버깅: 개발 중이나 운영 중인 애플리케이션에서 문제가 발생했을 때, 로그를 통해 문제의 원인을 빠르게 파악할 수 있다.
  2. 모니터링: 애플리케이션의 동작과 사용자의 활동을 기록하여, 시스템의 성능 모니터링 및 보안 감사에 활용할 수 있다.
  3. 정보 기록: 시스템의 상태, 에러 메시지, 트랜잭션 정보 등 중요한 정보를 기록하여, 나중에 참조할 수 있다.

스프링 부트에서 로깅 설정하기

1
2
logging.level.org.springframework=INFO  # 스프링 프레임워크 로그 수준 설정
logging.level.com.hello.springboot=DEBUG # 특정 패키지 로그 수준 설정

로깅 수준

TRACE ➡️ DEBUG ➡️ INFO ➡️ WARN ➡️ ERROR

수준이 낮을수록 더 많은 정보를 기록한다.

로거 사용하기

1
2
3
4
5
6
7
8
9
10
11
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {
    private static final Logger logger = LoggerFactory.getLogger(MyService.class);

    public void myMethod() {
        logger.info("정보 로그 메시지");
        logger.debug("디버그 로그 메시지");
    }
}

LoggerFactory.getLogger() 메소드를 통해 ‘Logger’ 인스턴스를 생성한다. 이 ‘Logger’을 사용하여 다양한 로그 레벨(‘info’, ‘debug’, ‘warn’, ‘error’)의 메시지를 기록할 수 있다.

SLF4J (Simple Logging Facade For Java)

SLF4J는 자바 기반 애플리케이션의 로깅을 위한 인터페이스 집합이다. SLF4J는 로깅의 추상화 계층을 제공함으로써, 개발자가 특정 로깅 구현체에 종속되지 않고 로깅을 할 수 있도록 도와준다. 즉, SLF4J는 로깅 프레임워크(Logback, Log4j)에 독립적인 인터페이스 역할을 한다.

SLF4J의 주요 특징

  1. 퍼사드(Facade)패턴: SLF4J는 다양한 로깅 프레임워크에 대한 일관된 API를 제공한다. 이는 로깅 프레임워크를 쉽게 교체할 수 있게 해준다.
  2. 로깅 구현체와 분리: SLF4J는 로깅 인터페이스만 제공하며, 실제 로깅 기능은 별도의 로깅 구현체(Logback, Log4j)가 당담한다.
  3. 단순성과 사용 편의성: SLF4J는 사용하기 쉽고, 로그 메시지를 기록하는 방법이 간단하다. 다양한 로그 레벨을 제공하여 상황에 맞는 로깅이 가능하다.
  4. 마커 지원: SLF4J는 마커(Marker) 기능을 지원하여, 로그를 더 세밀하게 분류하고 관리할 수 있다.

로그 레벨

  • TRACE: 가장 상세한 정보를 나타내며, 시스템의 동작을 이해하거나 문제를 진단할 때 사용 한다.
  • DEBUG: 개발 과정에서 일반적인 상태 정보를 나타내는 데 사용한다. 오류 추적이나 시스템의 흐름을 파악하는 데 유용하다.
  • INFO: 실행 중인 작업의 일반 정보나 중요한 이벤트를 기록한다. 시스템의 정상 작동 상태를 나타낸다.
  • WARN: 잠재적인 문제를 알릴 때 사용한다. 예상치 못한 상황이나 앞으로 문제가 발생할 가능성이 있을 때 기록한다.
  • ERROR: 심각한 문제가 발생했을 때 사용하낟. 에외 처리나 시스템의 주요 오류를 기록한다.

주로 사용하는 메시지 포맷

로깅에서 메시지 포맷은 로그를 기록할 때 사용하는 문자열의 구조를 의미한다. 좋은 메시지 포맷은 로그의 가독성과 유용성을 높여주며, 문제 해결과 시스템의 모니터링에 큰 도움이 된다.

기본 요소 포함

  • 시간 스탬프: 로그가 기록된 정확한 시간
  • 로그 레벨: 로그의 중요도를 나타내는 레벨
  • 스레드 이름: 로그를 기록하는 스레드의 이름
  • 로거 이름: 로그를 기록하는 클래스나 패키지 이름
  • 메시지: 로그의 실제 메시지 내용

예시 포맷

1
2024-02-24 12:00:00 [INFO] [mainThread] [com.example.MyClass] - 사용자 user1이 로그인했습니다.

로깅을 파일에 기록

로깅을 파일에 기록하기 위해서는 로깅 프레임워크의 설정을 통해 로그 파일의 위치, 형식, 로테이션 정책 등을 지정해야 한다.

Logback 사용

  1. logback.xml 설정 파일 생성: 프로젝트의 ‘src/main/resources’ 디렉토리에 ‘logback.xml’ 파일을 생성한다.
  2. Appender 설정: 로그 메시지를 파일에 기록하기 위한 ‘FileAppender’를 설정한다.
  3. Logger 설정: 로거의 로그 레벨과 Appender(로그 출력을 담당하는 역할)를 설정한다.
  4. 패턴과 로그 파일 경로 설정: 로그 파일의 저장 경로와 로그 메시지의 포맷을 지정한다.
1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/my_app.log</file>
        <encoder>
            <pattern>%date [%level] [%thread] %logger{10} [%file:%line] - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

Log4j 사용

  1. log4j.properties 또는 log4j.xml 설정 파일 생성: 프로젝트의 ‘src/main/resources’ 디렉토리에 ‘log4j.properties’ 또는 ‘log4j.xml’파일을 생성한다.
  2. Appender 설정: 로그 메시지를 파일에 기록하기 위한 ‘FileAppender’ 또는 ‘RollingFileAppender’를 설정한다.
  3. 패턴과 로그 파일 경로 설정: 로그 파일의 저장 경로와 로그 메시지의 포맷을 지정한다.
1
2
3
4
5
6
7
8
# log4j.properties 예시
log4j.rootLogger=INFO, FILE
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=logs/my_app.log
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.MaxBackupIndex=5
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
This post is licensed under CC BY 4.0 by the author.

© chanho. Some rights reserved.