1. 로깅 (logging)
- 애플리케이션의 동작, 오류, 이벤트 등을 기록하는 과정
- 로깅으로 작성된 로그를 통해 개발자가 애플리케이션의 상태를 모니터링하고 문제 진단, 성능 분석 가능
- 주요 목적 : 오류 해결, 보안 감사, 성능 개선 등
1-1. 로그 기록 장소
- 콘솔
- 파일
- 이메일/문자 (SMTP/SMS)
- DB
1-2. 로깅 레벨
- 패키지나 클래스 별로 로그에 남길 정보의 정도 설정 가능
- (스프링 부트의 로그 프레임워크인 LogBack 의 로그 레벨) TRACE < DEBUG < INFO < WARN < ERROR
- 좌측일수록 상세한 수준 (다음 레벨의 내용 모두 포함) / 우측일수록 중요한 수준
- ex) DEBUG 로그 : INFO, WARN, ERROR 로그를 모두 포함
- TRACE : 개발 단계에서 사용, DEBUG 레벨보다 상세한 수준의 로그 출력
- DEBUG : 개발 단계에서 사용, 디버깅 가능한 상세한 수준의 로그 출력
- INFO : 로그에 저장하고 싶은 중요 애플리케이션 이벤트 (운영에 참고되는 정보 등)
- WARN : 상황에 따라 위험해질 수 있는 정보 (예외 처리 등)
- ERROR : 즉시 대응해야 할 에러 레벨 로그 ⇒ 미대응 시 심각한 장애 발생 가능!
- 좌측일수록 상세한 수준 (다음 레벨의 내용 모두 포함) / 우측일수록 중요한 수준
2. 스프링 부트 로깅
2-1. SLF4J
- SLF4J : Simple Logging Facade for Java
- 자바 애플리케이션에서 로깅을 위한 추상화 계층을 제공하는 라이브러리
⇒ 로깅 구현체에 대한 의존성을 줄여줌! - 다양한 로깅 프레임워크 (Log4j, Logback, JDK logging 등) 와의 호환성 유지, 로깅 관리가 쉬움
⇒ SLF4J의 간단한 api 통해서 로그 작성함 / 실제 로깅 작업은 로깅 프레임워크가 처리함!
2-2. Logback
- Java 기반 로깅 프레임워크
- SLF4J의 구현체 중 하나 (SLF4J api 로 로그 작성 → Logback이 실제 로깅 작업 처리!)
- 프로젝트에 springboot-web 의존성이 추가되어 있다면 기본적으로 logback 프레임워크 사용 가능
2-3. 로깅 방법
2-3-0. spring-boot-starter-web 의존성 추가
- build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
2-3-1. 로거 인스턴스 수동 생성
private Logger log = LoggerFactory.getLogger(Log.class);
2-3-2. 로거 인스턴스 자동 생성 (@Slf4j 어노테이션)
- build.gradle
- 롬복 의존성 추가
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
- 클래스 레벨에 @Slf4j 어노테이션 추가
@Slf4j
public class LoggingService {
// 로거 인스턴스 생성 코드 자동 생성
}
2-3-3. 로그 출력
log.error("error message = default error level message"); // error 레벨 로그
log.warn("warn message = default warn level message"); // warn 레벨 로그
log.info("info message = default info level message"); // info 레벨 로그
log.debug("debug message = default debug level message"); // debug 레벨 로그
log.trace("trace message = default trace level message"); // trace 레벨 로그
- 위의 코드를 실행해보면 info 레벨 로그까지만 출력될 것임
- Logback 프레임워크의 기본 로그 레벨은 info 이므로 error, warn, info 까지만 출력됨
3. 로깅 설정
- application.yml에서 Logback의 로깅 설정 방법
- logback-spring.xml 생성해서 Logback의 로깅 설정 방법
3-1. application.yml 에서 설정
3-1-1. 로그 레벨 설정
logging:
level:
root: INFO # 애플리케이션의 기본 로그 레벨 설정
com.example: DEBUG # 특정 패키지의 로그 레벨 설정
com.example.LoggingService: TRACE # 특정 클래스의 로그 레벨 설정
3-1-2. 파일에 로그 기록 설정
logging:
file:
name: example_log/myApp.log # 로그가 기록될 파일 설정
3-1-3. 로그 패턴 설정
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" # 콘솔 출력 패턴 설정
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" # 파일 출력 패턴 설정
- 콘솔에 출력된 로그 예시
- 파일에 출력된 로그 예시
⇒ 콘솔과 파일 각각 다른 로그 패턴 적용함을 확인!
3-2. logback-spring.xml 에서 설정
3-2-1. 기본 logback-spring.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 로그 패턴 설정 -->
<pattern>
로그 패턴 설정 : %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- 전역 로그 레벨 설정 -->
<root level="debug">
<!-- 콘솔 출력 설정 -->
<appender-ref ref="STDOUT"/>
</root>
</configuration>
- 실행결과
3-2-2. 파일에 로그 기록 설정
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- 로그 파일 이름 설정 -->
<file>./log_by_logback-spring/myApp.log</file>
<encoder>
<!-- 로그 패턴 설정 -->
<pattern>
파일 로그 패턴 설정 : %d{yyyy-MM-dd} [%thread] %-5level %logger{10} [%file:%line] -%kvp- %msg%n
</pattern>
</encoder>
</appender>
<!-- 전역 로그 레벨 설정 -->
<root level="debug">
<!-- 파일 출력 설정 -->
<appender-ref ref="FILE"/>
</root>
</configuration>
- 실행결과