욱'S 노트

Logback - SiftingAppender 본문

Programming/Logback

Logback - SiftingAppender

devsun 2015. 8. 18. 18:23

이름에서 암시하듯이 SiftingAppender는 런타임시에 주어진 어트리뷰터에 따라 로깅을 분리하거나 걸러낼 수 있다. 예를 들어 SiftingAppender는 유저 세션에 따라 로깅 이벤트를 분리할 수 있다. 이러한 방법을 이용하면 각 유저별로 하나씩의 로그 파일을 생성할 수 있다.


각 프로퍼티들은 다음과 같다.


timeout

- 타입은 Duration이다. 

- 내포된 appender가 작동하지 않는다고 간주될때 타임아웃 시간. 오류 appender는 닫아지고 SiftingAppender에 의한 참조가 끊어진다.


maxAppederCount

- 타입은 integer이다.

- SiftingAppender가 생성하고 유지할 수 있는 내포된 appender의 최대 갯수. 기본값은 Integer.MAX_VALUE 이다.


SiftingAppender는 내포된 appender를 바로 생성하기 위해 이러한 기능을 가지고 있다. 내포된 appender는 SiftingAppendar 자신에 명시된 템플릿을 바탕으로 생성된다. SiftingAppender는 자식 appender들의 라이프사이클을 관리한다. 예를 들어 SiftingAppender는 자동으로 작동하지 않는 appender를 닫고 제거한다. 내포된 appender는 타임아웃 파라미터에 의해 명시된 기간동안 접근하지 않으면 동작하지 않는다고 간주한다.


로깅 이벤트를 처리할 때 SiftingAppender는 위임할 자식 appender를 선택할 것이고, 선택기준은 discriminator에 의해 runtime시에 계산된다. 유저는 선택 기준을 명시할 수 있다. 예제를 살펴보자.


Example


SiftExample 어플리케이션은 어플리케이션이 시작되면 메시지를 로깅한다. MDC 키 "userid"를 "Alice"로 설정한 다음 메시지를 로깅한다. 아래 코드를 살펴보자.


logger.debug("Application started");

MDC.put("userid", "Alice");

logger.debug("Alice says hello"); 


SiftingAppender가 사용하는 설정 파일 템플릿은 다음과 같다.


<configuration>

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">

    <!-- in the absence of the class attribute, it is assumed that the

         desired discriminator type is

         ch.qos.logback.classic.sift.MDCBasedDiscriminator -->

    <discriminator>

      <key>userid</key>

      <defaultValue>unknown</defaultValue>

    </discriminator>

    <sift>

      <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender">

        <file>${userid}.log</file>

        <append>false</append>

        <layout class="ch.qos.logback.classic.PatternLayout">

          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>

        </layout>

      </appender>

    </sift>

  </appender>


  <root level="DEBUG">

    <appender-ref ref="SIFT" />

  </root>

</configuration>


클래스 어트리뷰트를 설정하지 않으면 discriminator의 타입은 MDCBasedDisscriminator로 가정한다. 키 프로퍼티에 의해 주어진 키아 연관된 MDC 값은 discriminating 값이다. 하지만 MDC 값이 null이면 defaultValue에 있는 값을 사용한다.


SiftingAppender는 자식 appender들을 설정하고 참조할 수 있는 능력을 가지고 잇다. 위의 예제에서 SiftingAppdender는 다수의 FileAppender 인스턴스를 생성할 것이다. 각 FileAppender 인스턴스는 userid MDC 키와 연관된 값으로 식별되어 진다. 만약 userid에 새로운 값이 할당되면 새로운 FileAppender 인스턴스가 생성되고, SiftingAppender는 관리할 것이다. Appender는 30분간 사용되지 않으면 자동으로 닫히고 사라진다.


VARIABLE EXPORT 


다른  appender 인스턴스를 가지는 것만으로는 불출분하다. 각 인스턴스는 반드시 다른 타겟 리소스에 출력해야 할 것이다. 이러한 방법을 지원하기 위해 discriminator에 전달된 key는 appender 템플릿 내에서 사용할 수 있다. 위의 예에서 userid는 변수로 노출된다. 또한 이러한 변수는 각 자식 appender에서 실제 리소스를 구분하기 위해 사용될 수 있다. 


SiftExample 어플리케이션을 구동하면 결과로 unknown.log 와 Alice.log 파일이 생성 될 것이다.


LOCAL-SCOPED VARIABLES 


1.0.12 버젼부터 local scope로 정의된 프로퍼티는 내포된 appender에서 이용가능하다. 변수를 선언할 수 있을뿐 아니라 <sift> 엘레먼트와 함께 동적으로 변수를 계산할 수 도 있다. 외부에 선언된 변수와 <sift> 엘레먼트내부에서 조합하는 것 또한 지원한다

Comments