log_module은 Spring Boot 기반 프로젝트의 로그 관리를 간소화하고, 환경별 설정, 일관된 로그 관리, 그리고 유지보수성 향상을 목표로 설계된 모듈입니다.
이 모듈은 다음과 같은 문제를 해결하는 데 초점을 맞춥니다:
- 환경에 따른 로그 관리의 복잡성 해소
- API 호출 추적 및 디버깅 편의성 증대
- 초기 프로젝트 설정 효율성 강화
시스템 요구 사항:
Spring Boot 3 ⬆️, Java 17 ⬆️서브모듈은 다른 Git 저장소를 현재 프로젝트에 종속적으로 포함시키는 방법입니다.
log_module을 서브모듈로 설정하려면 아래 과정을 따릅니다.
git submodule add https://github.com/Gupuroom/log_module.git log_module
git submodule init
git submodule update💡 참고: 다른 개발자가 이 프로젝트를 클론하면, 서브모듈 데이터가 포함되지 않을 수 있으니 아래 명령어를 실행해야 합니다.
git clone <repository_url> git submodule update --init --recursive멀티모듈 설정은 하나의 프로젝트가 아닌 여러 Module을 모아 구성한 프로젝트 구조를 말합니다.
여기서는 log_module을 Root 프로젝트에 모듈로서 포함하여, 의존성을 관리하고 log_module의 기능을 Root 프로젝트에서 활용할 수 있도록 설정하는 방법을 설명합니다.
log_module을 프로젝트에 포함:
include ':log_module'
allprojects {
repositories {
mavenCentral() // 모든 모에서 Maven Central을 사용할 수 있게 설정
}
}
dependencies {
...
implementation project(':log_module') // log_module을 의존성에 추가
...
}
subprojects {
apply plugin: 'java' // Java 플러그인을 모든 서브모듈에 적용
apply plugin: 'org.springframework.boot' // Spring Boot 플러그인을 서브모듈에 적용
apply plugin: 'io.spring.dependency-management' // 의존성 관리를 위한 플러그인 적용
}
멀티모듈 프로젝트에서는 @SpringBootApplication에서 각 모듈의 패키지를 스캔해야 합니다.
루트 프로젝트의 @SpringBootApplication을 아래와 같이 scanBasePackages를 정합니다:
@SpringBootApplication(scanBasePackages = {"com.example [본인 프로젝트 경로]", "com.log_module"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}이 모듈은 로깅 관련 설정을 YAML 파일을 통해 간편하게 구성할 수 있도록 지원합니다.
프로젝트의 루트 application.yml 파일에서 아래 설정값을 지정하여 로깅 동작을 제어할 수 있습니다.
값을 설정하지 않을 경우, **아래 값(기본값)**으로 동작합니다.
log-module:
config:
active: true # 동작 여부
log-dir: logs # 로그 파일 저장 경로
max-history: 30 # 로그 파일 저장 기한
response-length-limit: 200 # ResponseBody 최대 길이이 모듈은 Spring Profiles를 통해 로깅 동작을 환경별로 제어할 수 있습니다.
Root 프로젝트의 application.yml에서 사용할 환경을 지정해야 하며,
Root 프로젝트의 application.yml에서 사용할 환경을 아래와 같이 지정합니다.
spring:
profiles:
active: local # local, dev, real or prod 중 선택- 🔥지정하지 않을 경우: 기본적으로 콘솔 로깅만 동작합니다.
- 지정할 수 있는 프로필: local, dev, real (또는 prod)
각 프로필에 따라 다음과 같이 로깅이 동작합니다.
상세 설정은 logback-spring.xml에서 확인할 수 있습니다.
local: [ 콘솔 로깅: ✅ 에러 로그 파일: ✅ API 로그 파일: ✅ ]
dev: [ 콘솔 로깅: ✅ 에러 로그 파일: ✅ API 로그 파일: ✅ 콘솔 로그 파일: ✅ ]
real OR prod : [ 에러 로그 파일: ✅ API 로그 파일: ✅ 콘솔 로그 파일: ✅ ]
# Root 프로젝트의 application.yml
spring:
profiles:
active: dev # dev 환경 활성화
log-module:
config:
active: true
log-dir: logs
max-history: 30
response-length-limit: 200log_module은 다음과 같은 패키지 구조입니다:
com.log_module
│
├── config
│ └── LoggingConfig # Spring Boot 설정 클래스
│
├── logging
│ ├── filter
│ │ ├── ApiLogFilter # API 로그 필터
│ │ ├── ErrorLogFilter # ERROR 로그 필터
│ │ ├── RequestWrapperFilter # Request Wrapper 필터
│ │ └── ResponseWrapperFilter # Response Wrapper 필터
│ ├── interceptor
│ │ └── LoggingInterceptor # 로그 인터셉터
│ ├── type
│ │ └── MDCKey # MDC Key 정의
│ └── wrapper
│ └── CustomHttpRequestWrapper # 커스텀 HTTP 요청 래퍼
│ └── CustomHttpResponseWrapper # 커스텀 HTTP 응답 래퍼log_module은 다양한 환경과 요구 사항에 맞춰 유연하게 설계된 모듈로, 다음과 같은 주요 특징을 제공합니다:
local,dev,real환경에 따라 로그 출력- local:
Console출력 - dev/real:
Api로그,Error로그,Console로그를 각각 별도의 파일로 분리 기록
- local:
- Error 로그와 Api 로그를 분리하여 저장
- Error 로그는 별도 파일에 기록하여 디버깅과 문제 추적이 용이
- API 로그는
traceId를 포함해 호출 흐름을 명확히 추적 가능
- 로그 파일을 일별로 분리하고, 자동으로 압축 및 보관일 설정
- 기본적으로 30일간 보관하며, yml 파일에서 보관 기간 변경 가능
- Spring Boot 프로젝트에서 별도의 복잡한 설정 없이 손쉽게 적용 가능
- 단순한 구조로 설계되어, 다른 프로젝트에서도 재사용 가능
- 각 API 호출 시
traceId를 기록하여 디버깅 및 에러 발생 시 관련 로그 검색 용이 - 에러 발생 시
traceId를 통해 연관된 로그 추적
- 기본적으로 제공되는 TestController 를 통해, 모듈 테스트 및 검증이 용이
이 모듈은 단순히 로그를 기록하는 기능뿐 아니라, 개발 및 운영 환경에서 로그 관리를 체계적으로 할 수 있도록 설계되었습니다.