로그를 남기자 - Logback(3)

후니·2023년 6월 10일
0

Logback

목록 보기
3/5
post-thumbnail

# 관련 소스는 여기에서 확인하실 수 있습니다.

기본기가 튼튼해야...!

뭔가 대단한 것을 찾은 것 같지만,
사실 아주아주 기초적인 것에서 실마리를 찾았다. 바로 자바의 상속 개념!
그렇다면 무엇을 상속받아야 하는가!? 이제부터 찬찬히 살펴보도록 하겠다.

RollingFileAppender

Logback에서는 RollingFileAppender라는 로그를 파일로 남기기 위해 사용하는 클래스가 존재한다. 이 클래스 안에 여러 가지 설정들을 통하여 파일 경로, 파일 이름, 보관 주기, 롤링 조건들을 컨트롤할 수 있도록 하는데, 얘기하고자 하는 주제가 아니니 자세한 설명은 넘어가도록 하겠다. (검색해 보면 상세히 설명된 곳들이 많다)

아무튼, RollingFileAppender에는 파일 롤링을 관리하는 몇 가지 rollingPolicy를 설정할 수 있는데 내가 받은 조건은 시간 관련 요구 조건이라 TimeBasedRollingPolicy로 설정하였다.

rollingPolicy에는 rollover의 시기를 지정할 수 있는 TriggeringPolicy을 설정할 수 있다. 다만, 기본적으로는 Logback 내부에 정해져있는 규칙에 따른 rollover 시기를 지정할 수 있는 것뿐이라, 내가 구현하고자 하는 조건에는 맞추지 못했던 것이다.

그래서 무엇을 상속 받았을까?

결론적으로 말하자면, DefaultTimeBasedFileNamingAndTriggeringPolicy라는 TimeBasedFileNamingAndTriggeringPolicyBase 추상 클래스의 구현체를 상속받았다.

처음에는 RollingFileAppender 자체를 상속받아서 rollover를 직접 컨트롤하려고 했으나, 외부 라이브러리의 내부 클래스 정보에 대해 접근하는 부분에 있어서 제약이 많아서 실패하고 말았다.

내가 DefaultTimeBasedFileNamingAndTriggeringPolicy 클래스에서 재정의한 메서드는 아래와 같다.

  1. DefaultTimeBasedFileNamingAndTriggeringPolicy 클래스의 isTriggeringEvent 메서드
  2. TimeBasedFileNamingAndTriggeringPolicyBase 클래스의 computeNextCheck 메서드

먼저 DefaultTimeBasedFileNamingAndTriggeringPolicy 클래스의isTriggeringEvent메서드는 로그 이벤트가 발생했을 경우에 rollover를 해도 되는지 아닌지를 판별하면서 다음 rollover 시기를 계산하고 저장하는 기능을 수행한다. 이 메서드를 오버라이딩해서 로그 파일의 이름을 요구사항에 맞추도록 수정하였다.

그리고 TimeBasedFileNamingAndTriggeringPolicyBase 클래스의 computeNextCheck 메서드는 다음 rollover 시기를 계산하여 저장하는 기능을 수행한다.

원래 computeNextCheck의 코드는 RollingCalendar 클래스의 getNextTriggeringDate 메서드를 호출하고 그 안에서 getEndOfNextNthPeriod 호출하는데, 호출 시 롤링 주기가 1로 고정되어 있어 logback 기본 설정으로는 원하는 주기를 맞출 수 없었던 것이다.

그래서 나는 getNextTriggeringDate 메서드를 거치지 않고 바로 getEndOfNextNthPeriod 메서드를 호출하면서 원하는 롤링 주기를 인자로 넣어주도록 변경하였다.

그래서 그 다음은...?

이제까지 요구사항과 문제점을 파악하고 해결책을 찾는 과정, 그리고 해결에 대한 방법을 서술하였다. 다음 편에서는 작성한 코드를 보면서 설명하는 시간을 갖도록 하겠다. (생각보다 간단해서 실망할지도...?!)

profile
-ing

0개의 댓글