본문 바로가기

Spring Boot

로깅 : 환경별 로깅 전략

yaml파일을 환경별로 나누기

 

 - 개발, 테스트, 운영환경에 따라 로깅 전략 분리

 - 환경별 로깅 설정

 - 로그파일 보관, 용량제한, 압축정책

 - 로그레벨을 애플리케이션 실행 중 동적으로 변환하는방법

 - 운영 로그 관리 및 디스크 용량 최적화

 

 

개발, 운영 환경설정 분리

개발환경, 운영환경 로깅 목적과 중요도는 다르다.

개발자는 디버깅을 위해 상세한 로그가 필요하지만 운영환경에서는 시스템 성능, 보안, 디스크 사용량을 고려해 최소한의 로그만 남기는게 바람직하다고 함

따라서 스프링부트에서는 @Profile이나 spring.profiles.active에 따라 환경을 구분하고

Logback 설정파일에서는 <springProfile>을 사용해서 환경별 설정을 나눌 수 있음

 

요구사항에서 개발, 운영환경에 대한 프로파일을 구성할 때 만든 yaml파일을 통해 분리했었다

그 종류들

일반적으로 main - resources폴더에 생성한다

application.yml : 공통설정 및 profile 활성화 설정

application-dev.yml : 개발 환경 전용 설정

application-test.yml : 테스트 환경 전용 설정

application-prod.yml : 운영 환경 전용 설정

logback-spring.yml : 환경 공통 및 프로필 기반 로깅 설정

 

application.yml : 공통설정 및 프로필 활성화 설정

spring:
  profiles:
    active: dev # 기본 활성화 프로필

 

application-dev.yml : 개발 환경 전용 설정

logging:
  level:
    root: DEBUG
    com.example.myapp: DEBUG
    org.hibernate: WARN
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"

 

application-test.yml : 테스트 환경 전용 설정, org.hibernate가 없음

logging:
  level:
    root: INFO
    com.example.myapp: INFO
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"

 

application-prod.yml : 운영 환경 전용 설정, org.hibernate, console 없음

logging:
  level:
    root: WARN
    com.example.myapp: INFO
  file:
    name: logs/myapp.log

 

logback-spring.yml : 환경 공통 및 프로필 기반 로깅 설정

logging:
  file:
    name: logs/myapp.log
    
  logback:
    rollingpolicy:
      file-name-pattern: logs/myapp.%d{yyyy-MM-dd}.log
      max-history: 90
      total-size-cap: 10GB
      clean-history-on-start: true # 애플리케이션 시작 시 오래된 로그를 삭제함

 

* logback-spring.yml은 XML기반 설정을 대체할 수 있다. 스프링에서 자동으로 파싱하여 로깅 설정에 반영함

* logging.logback.rollingpolicy는 logback-spring.yml에서만 지원된다. 따라서 application-dev,test,prod.yml에서는 설정하지 않음

* 개발, 운영 등 프로필별 로깅 레벨은 dev, test, prod.yml에서 관리하고 실제 로그 파일 정책은 logback-spring.yml에서 설정

 

 

로그 파일 관리

XML방식으로 사용하면 줄이 그어지지 않던데 yml파일에서 설정하면 일부는 사용하지 않거나 옛날거라고 줄이 그어진다.

사용은 가능하니까 쓰면 되는 것으로 보임

 

로그 관리 전략

maxHistory : 로그 보관일수 설정 (90 등)

totalSizeCap : 로그 전체 크기 제한. 초과시 오래된 로그부터 삭제됨

fileNamePattern : 로그 파일 이름에 날짜를 포함시켜서 일별 분할 설정

cleanHistoryOnStart : 애플리케이션 시작 시 오래된 로그를 즉시 삭제함

압축 설정 : 보통 .gz 형태로 자동 압축되어 저장됨

 

Logback XML 방식

<rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
	<fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
    <maxHistory>90</maxHistory>
    <totalSizeCap>10GB</totalSizeCap>
    <cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>

 

 

로그 레벨 조정

애플리케이션이 실행된 이후에도 로그 레벨을 동적으로 조정하고 싶을 때,

Spring Boot Actuator의 logger 엔드포인트? 를 사용하면 런타임에 로그 레벨을 조정할 수 있음

1. build.gradle 설정

dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' }

 

2. application.properties 설정

# 엔드포인트
management.endpoints.web.exposure.include=loggers
management.endpoint.loggers.enabled=true

management:
  endpoints:
    web:
      exposure:
        include: loggers
    loggers:
      enabled: true

 

3. 로그 레벨 동적 변경 예시, cURL

curl -X POST -H "Content-Type: application/json" \\
     -d '{"configuredLevel": "DEBUG"}' \\
     <http://localhost:8080/actuator/loggers/com.example.myapp>

이 요청을 통해서 com.example.myapp 패키지의 로그 레벨을 DEBUG로 변경할 수 있음, 필요할 때 TRACE, INFO, WARN, ERROR 등으로도 설정할 수 있음