지난 번엔 기존 Spring Boot의 Logging 관련 설정들이 어떻게 적용되는지 알아보았다. 이제 그 흐름 사이에 추가하려고 하는 Log4J2의 Rolling Policy 속성들을 읽을 수 있도록 끼워넣으면 된다! 직접 구현한 내용에 대해 회고 및 자가 피드백할 겸 남겨두려고 한다.
흐름을 다시 살펴보면
1. properties, yml에 정의한 속성을 시스템 프로퍼티로 읽게 하기
2. 시스템 프로퍼티에 작성된 로깅 관련 값들을 log4j2-file.xml 파일에서 소비
하는 단계로 이루어져있다.
이제 해야할 일은 다음과 같다.
1. properties, yml에 Rolling Policy 관련 설정을 추가하면 시스템 프로퍼티로 작성할 수 있게 하기
2. 새로운 프로퍼티를 xml 파일이 읽을 수 있도록 하기
* Logback에서는 이미 Rolling Policy를 지원하고 있기 때문에 해당 내용을 참고하여 코드를 작성했다.(사실 거의 복붙)
Log4J2에 새로운 Property 추가
이전 글에서 확인한것과 같이 Logging을 위한 기본적인 Property는 LoggingSystemProperty에 작성되어있다. 근데 Logback은 RollingPolicySystemProperty라는 enum으로 Rolling Policy 속성이 정의되어있는데, Log4J2에는 이런 정의가 없다!
그래서 일단 새로운 프로퍼티를 Log4j2RollingPolicySystemProperty라는 enum으로 정의해주었다.




기존 Spring Boot가 채용하고 있던 방식을 최대한 해치지 않기 위해 이름만 바꿔서 추가해주었다!
이제 추가한 속성들을 시스템 프로퍼티로 작성해주어야 한다. 기존에는 LoggingSystemProperties의 apply()가 진입점 역할을 해주었으니 해당 클래스를 상속받아 apply에 끼워넣어주는 Log4j2LoggingSystemProperties 클래스를 만들어주었다.




Logback의 구현체와 로직이 다른 점이 하나 있는데, getProperty 메서드이다. getProperty는 applyRollingPolicy를 호출할 때 내부에서 실행되는데, 설정 파일에 명시된 값을 원하는 타입으로 읽는 파서(parser)이다.
이 부분도 코드 분석하다가 알게 되었는데, Logback에서 사용되는 마지막 줄 FileSize.valueOf 메서드가 Logback 패키지에 들어가있는 메서드이다. 따라서 Log4j2에서 해당 메서드를 사용하게 된다면 Logback을 의존하게 되기 때문에 해당 부분을 고려하여 DataSize 파싱 폴백 로직을 직접 구현해주었다.
또한 Logback에서는 DataSize.ofBytes로 파싱하는데, applyRollingPolicy에 바이트로 파싱하는 로직이 있기 때문에 Log4j2에서는 생략해주었다.
String stringValue = String.valueOf((value instanceof DataSize dataSize) ? dataSize.toBytes() : value);
@SuppressWarnings는 컴파일러 경고를 특정 지점에서 숨기기 위한 애노테이션이다. 실제 동작에는 영향이 없고, 경고만 억제한다. 여기서는 제네릭 미검사 캐스트 경고를 숨기기 위해서 사용한 것으로 추측된다. getProperty는 제네릭 반환형 <T>를 갖는데, DataSize 처리에서 DataSize.parse(), DataSize.ofBytes()처럼 컴파일러가 타입 안정성을 증명할 수 없는 캐스트가 발생하게 된다. 하지만 해당 캐스트는 실제론 type == DataSize.class일 때만 실행되므로 런타임 상 안전한데, 이때 “unchecked” 경고를 억제하려고 @SuppressWarnings("unchecked")를 붙인다.
이제 이전 글에서 확인했던 진입점이다. 첫 번째로 LoggingSystemProperties를 호출하는 지점인데, 여기서는 실제로 구현체에 따라서 LogbackLoggingSystem을 사용할지, Log4J2LoggingSystem을 사용할지 지정한다.

getLoggingSystemProperties를 호출할 때 현재 LoggingSystem에 저장된 클래스의 SystemProperties를 가져오는데, 기존엔 Log4j2 전용 프로퍼티가 없었기 때문에 getSystemProperties를 따로 오버라이드하지 않고 공통 시스템 프로퍼티만 불러왔었다. 하지만 이제 Log4j2 전용 프로퍼티를 설정해주었기 때문에 오버라이드해서 프로퍼티를 끼워넣어주도록 했다.

이렇게 새롭게 추가해준 프로퍼티들을 적용할 수 있다!
테스트 코드
새로 추가한 프로퍼티가 정상적으로 시스템 프로퍼티로 올라가는지 확인하기 위한 테스트 코드를 작성했다.

각 테스트는 MockEnvironment로 입력 값을 주입하고, 실제 System.setProperty 경로를 통해 LOG4J2_ROLLINGPOLICY_* 시스템 프로퍼티가 설정되는지 검증한다. 전역 상태 격리를 위해 매 테스트 전/후에 시스템 프로퍼티를 스냅샷/복원하는 과정을 추가해주었다.

MockEnvironment로 입력을 제공하고 기본 세터로 실제 시스템 프로퍼티 기록을 검증하는 간단한 테스트이다. 동작을 혹인하는 총 5개의 테스트로 검증해보았으며 전부 통과하여 정상적으로 동작하는 것을 확인했다!
이렇게 설정 파일에 명시한 설정들을 시스템 프로퍼티로 잘 읽어가는지 확인해보았다. 그리고 다음 글에 여러 Rolling Policy들을 xml에서 어떻게 적용하는지 작성해보겠다!
Log4J2 Properties 개발기 1편
개발 배경Spring Boot는 Slf4J의 기본 구현체로 Logback을 지원한다. 하지만 대부분은 성능, 편의상 이유로 기본 의존성 Logback을 제거하고 Log4J2를 사용할 것이다. 로깅에는 Rolling Policy라는 것이 존재한
bird-j.tistory.com
Log4J2 Properties 개발기 3편
이제 마지막으로 새로 추가한 Rolling Policy를 Spring Boot의 기본 xml 파일에서 어떻게 읽는지 확인해보도록 하자. 대부분 비슷한 내용이지만 블럭에 새로운 Rolling Policy를 적용한 것을 확인할 수 있다.
bird-j.tistory.com
'Computer Science > Spring Boot' 카테고리의 다른 글
| Spring Boot docker image build fail issue (0) | 2025.10.24 |
|---|---|
| Log4J2 Properties 개발기 3편 (0) | 2025.10.22 |
| Log4J2 Properties 개발기 1편 (0) | 2025.10.20 |
| Spring Security - 인증/인가와 FilterChain (w. JWT, Authorization) (0) | 2025.09.12 |
| 재고 관리에서 발생한 동시성 문제 해결 (0) | 2025.09.03 |