Spring 로깅 라이브러리

Spring Boot 서비스의 로그를 어떻게 적재할 것인지에 대한 설명을 작성한다.


1. System.out.println

  • Java에서 콘솔 출력을 하기 위한 기본적인 방법
  • 작은 규모의 프로젝트에서 편의성을 위해 사용할 수 있으나, Spring 프로젝트 등에서는 별도 로그 프레임워크 사용 권장

2. java.util.logging

  • 자바 1.4부터 기본적으로 제공되는 로깅 유틸리티
  • 원하는 기능이 아주 기본적인 수준이라면 외부 라이브러리 사용 없이 로깅이 가능하다
  • 다른 라이브러리와 비교했을 때 퍼포먼스 (속도) 가 느리다
  • 유연하지 않다

3. 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