[Spring] 로그 관리하기 _ Logger
로거(Logger)는 애플리케이션의 실행 중에 발생하는 이벤트를 기록하는 도구이다. 로깅(Logging)은 이러한 이벤트를 시스템 콘솔, 파일, 네트워크 서버 등에 기록하는 프로세스를 말한다.
로거(Logger)가 필요한 이유
- 디버깅: 개발 중이나 운영 중인 애플리케이션에서 문제가 발생했을 때, 로그를 통해 문제의 원인을 빠르게 파악할 수 있다.
- 모니터링: 애플리케이션의 동작과 사용자의 활동을 기록하여, 시스템의 성능 모니터링 및 보안 감사에 활용할 수 있다.
- 정보 기록: 시스템의 상태, 에러 메시지, 트랜잭션 정보 등 중요한 정보를 기록하여, 나중에 참조할 수 있다.
스프링 부트에서 로깅 설정하기
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의 주요 특징
- 퍼사드(Facade)패턴: SLF4J는 다양한 로깅 프레임워크에 대한 일관된 API를 제공한다. 이는 로깅 프레임워크를 쉽게 교체할 수 있게 해준다.
- 로깅 구현체와 분리: SLF4J는 로깅 인터페이스만 제공하며, 실제 로깅 기능은 별도의 로깅 구현체(Logback, Log4j)가 당담한다.
- 단순성과 사용 편의성: SLF4J는 사용하기 쉽고, 로그 메시지를 기록하는 방법이 간단하다. 다양한 로그 레벨을 제공하여 상황에 맞는 로깅이 가능하다.
- 마커 지원: SLF4J는 마커(Marker) 기능을 지원하여, 로그를 더 세밀하게 분류하고 관리할 수 있다.
로그 레벨
- TRACE: 가장 상세한 정보를 나타내며, 시스템의 동작을 이해하거나 문제를 진단할 때 사용 한다.
- DEBUG: 개발 과정에서 일반적인 상태 정보를 나타내는 데 사용한다. 오류 추적이나 시스템의 흐름을 파악하는 데 유용하다.
- INFO: 실행 중인 작업의 일반 정보나 중요한 이벤트를 기록한다. 시스템의 정상 작동 상태를 나타낸다.
- WARN: 잠재적인 문제를 알릴 때 사용한다. 예상치 못한 상황이나 앞으로 문제가 발생할 가능성이 있을 때 기록한다.
- ERROR: 심각한 문제가 발생했을 때 사용하낟. 에외 처리나 시스템의 주요 오류를 기록한다.
주로 사용하는 메시지 포맷
로깅에서 메시지 포맷은 로그를 기록할 때 사용하는 문자열의 구조를 의미한다. 좋은 메시지 포맷은
로그의 가독성과 유용성
을 높여주며, 문제 해결과 시스템의 모니터링에 큰 도움이 된다.
기본 요소 포함
- 시간 스탬프: 로그가 기록된 정확한 시간
- 로그 레벨: 로그의 중요도를 나타내는 레벨
- 스레드 이름: 로그를 기록하는 스레드의 이름
- 로거 이름: 로그를 기록하는 클래스나 패키지 이름
- 메시지: 로그의 실제 메시지 내용
예시 포맷
1
2024-02-24 12:00:00 [INFO] [mainThread] [com.example.MyClass] - 사용자 user1이 로그인했습니다.
로깅을 파일에 기록
로깅을 파일에 기록하기 위해서는 로깅 프레임워크의 설정을 통해 로그 파일의 위치, 형식, 로테이션 정책 등을 지정해야 한다.
Logback 사용
logback.xml
설정 파일 생성: 프로젝트의 ‘src/main/resources’ 디렉토리에 ‘logback.xml’ 파일을 생성한다.- Appender 설정: 로그 메시지를 파일에 기록하기 위한 ‘FileAppender’를 설정한다.
- Logger 설정: 로거의 로그 레벨과 Appender(로그 출력을 담당하는 역할)를 설정한다.
- 패턴과 로그 파일 경로 설정: 로그 파일의 저장 경로와 로그 메시지의 포맷을 지정한다.
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 사용
log4j.properties
또는log4j.xml
설정 파일 생성: 프로젝트의 ‘src/main/resources’ 디렉토리에 ‘log4j.properties’ 또는 ‘log4j.xml’파일을 생성한다.- Appender 설정: 로그 메시지를 파일에 기록하기 위한 ‘FileAppender’ 또는 ‘RollingFileAppender’를 설정한다.
- 패턴과 로그 파일 경로 설정: 로그 파일의 저장 경로와 로그 메시지의 포맷을 지정한다.
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.