Spring 로깅 라이브러리
Spring Boot 서비스의 로그를 어떻게 적재할 것인지에 대한 설명을 작성한다.
1. System.out.println
- Java에서 콘솔 출력을 하기 위한 기본적인 방법
- 작은 규모의 프로젝트에서 편의성을 위해 사용할 수 있으나, Spring 프로젝트 등에서는 별도 로그 프레임워크 사용 권장
2. java.util.logging
- 자바 1.4부터 기본적으로 제공되는 로깅 유틸리티
- 원하는 기능이 아주 기본적인 수준이라면 외부 라이브러리 사용 없이 로깅이 가능하다
- 다른 라이브러리와 비교했을 때 퍼포먼스 (속도) 가 느리다
- 유연하지 않다
3. Log4j
- 퍼포먼스가 최적화되어있다
- 여러 종류의 appender를 지원한다.
- 최근 취약점 이슈가 많아서 사용할 수 없음 , 참고: (https://namu.wiki/w/Log4j 보안 취약점 사태)
4. Slf4j
- slf4j를 사용하여 설정에 따라 다른 로깅 라이브러리를 사용할 수 있게 된다.
- Application code -> log4j -> 기록 이던 것을 Application code -> slf4j (wrapper) -> log4j (혹은 log4j, logback, 등) 이런 식으로 확장 가능한 인터페이스
- 인터페이스를 사용하여 로깅을 구현하게 되면 좋은 점은 추후에 필요로 의해 로깅 라이브러리를 변경할 때 코드의 변경 없이 가능하다는 점이다.
추후에 서비스를 운영할 때 컨테이너화가 될 수도 있고, 혹은 로그를 필요 시에 따라 파일로 기록해서 보관해야할 때 확장이 유연하므로 Slf4j와 그 Implementation으로 logback을 사용한다.
Logback이란?
- Java에서 가장 많이 사용되었던 로깅 라이브러리인 log4j의 후속 버전
- Log4j를 만든 개발자가 Log4j를 기반으로 더 빠른 속도와 더 적은 메모리 점유율 등의 성능을 개발하여 만든 Logging Framework
- LogBack Manual: http://logback.qos.ch/manual/index.html
Logback Application 설정 예시
- file - 로깅 파일로 적재해서 기록해야 할 때 사용하면 된다.
- name - 로깅 파일이 적재될 위치
- max-size - 한 로깅 파일의 최대 용량, 초과할 시 파일이 추가로 만들어짐
- max-history - 로깅 파일의 보관 날짜 , 360이면 360일 이후부터 하루에 1개씩 지워짐
- clean-history-on-start - 서버 재시작마다 기록되고 있던 로그 삭제
- pattern - 로깅에 대한 포맷 패턴을 설정한다.
- console - 콘솔에 출력될 때 로그 포맷 ex) 2022-03-05 19:51:02 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8090 (http)
- file - 파일로 기록될 때 저장될 로그 포맷 , 이 때 [%thread]를 통해서 어떤 작업 때문에 서버에 부하가 발생했을지 예측하기 쉬우므로 반드시 포함되어야 함
- rolling-file-name : 서버 인스턴스 기준으로 하루가 넘어갈 때, logging.file 설정을 통해서 기록되는 로그 파일의 파일명 포맷 (gz로 압축하는 게 vi에디터로 터미널 상에서 바로 확인할 수 있으면서 압축이 돼서 최고 가성비임)
- level - 하위 디렉토리의 로그 레벨에 대해 설정한다
logging:
file:
name: ${user.home}/logs/service/scheduler.log
max-size: 200MB
max-history: 360
clean-history-on-start: false
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
rolling-file-name: "${user.home}/logs/service/scheduler.log.%d{yyyy-MM-dd}.%i.gz"
level:
org.springframework: INFO
com.backend: DEBUG
com.backend.scheduler.util: OFF
번외
logging.pattern.console을 아래와 같이 설정하고 코드 단에서 MDC, NDC 객체를 통해 값을 지정해 IP, UserId 등의 정보를 유동적으로 로그에 추가할 수 있다.
%-5p [%d{yyyy-MM-dd HH:mm:ss}|%X{ip}|%X{userId}|%t] - %c:%L:%M - %m%n
In Java Servlet Filter
MDC.put("ip", ip);
MDC.put("userId", userId);
Leave a comment