Link
Today
Total
11-28 02:07
Archives
관리 메뉴

초보개발자 긍.응.성

Logback - 5. Encoders 본문

Spring/Logback

Logback - 5. Encoders

긍.응.성 2020. 10. 4. 17:06
반응형

logback

logback 홈페이지의 매뉴얼을 읽으며 내용들을 정리한 글입니다.

Encoder란?

Encoder는 로그 이벤트를 바이트 배열로 변환하고, 해당 바이트 배열을 OutputStream에 쓰는 작업을 담당합니다. Encoder는 logback 0.9.19 버전 이후 등장하였습니다. 이전 버전에서 appender는 이벤트 메시지를 문자열로 변환하는데 layout을, write하는데 java.io.Writer를 사용하였습니다. 또한 이전 버전의 logback에서는 FileAppender 내에 PatternLayout을 중첩 선언하여 사용하였지만, 0.9.19 버전 이후부터는 FileAppender와 그 하위 클래스에 대해서는 encoder를 내장하여 더 이상 레이아웃을 사용하지 않아도 되도록 하였습니다.

Layout은 오직 이벤트를 문자열로만 변환할 수 있습니다. 이벤트가 기록되는 시기를 조절할 수 없기 때문에 일괄적으로 집계할 수 없습니다.

현재 PatternLayoutEncoder가 유일하게 제공되는 유일한 Encoder입니다. 이는 PatternLayout의 Wrapping 클래스입니다.

Encoder 인터페이스

 

위에서 설명했듯이, Encoder는 로그 이벤트를 바이트 배열로 변환 하며 해당 바이트 배열을 OutputStream에 쓰는 작업을 담당합니다. 그렇기에, encoder는 appender가 관리하는 OutputStream에 언제 그리고 어떤 내용의 메시지가 write 될것인지에 대한 완전한 제어권을 갖고 있습니다.

package ch.qos.logback.core.encoder;

public interface Encoder<E> extends ContextAware, LifeCycle {

   /**
   * This method is called when the owning appender starts or whenever output
   * needs to be directed to a new OutputStream, for instance as a result of a
   * rollover.
   */
  void init(OutputStream os) throws IOException;

  /**
   * Encode and write an event to the appropriate {@link OutputStream}.
   * Implementations are free to defer writing out of the encoded event and
   * instead write in batches.
   */
  void doEncode(E event) throws IOException;


  /**
   * This method is called prior to the closing of the underling
   * {@link OutputStream}. Implementations MUST not close the underlying
   * {@link OutputStream} which is the responsibility of the owning appender.
   */
  void close() throws IOException;
}

 

LayoutWrappingEncoder

logback 버전 0.9.19 까지는, 많은 appender는 Layout 인스턴스를 통해 로그 출력 형식을 제어하였습니다. 기존의 layout 인터페이스를 기반으로 하는 많은 양의 코드가 있었기에 Encoder가 layout과 상호 작용할 수 있을 방법이 필요하였습니다. LayoutWrappingEncoder는 encoder와 layout의 갭을 채워주는 교량 같은 역할을 담당합니다. LayoutWrappingEncoder는 encoder 인터페이스를 구현하며, layout을 내부에 가져 이벤트를 문자열로 변환하는 작업을 layout에게 delegate합니다.

아래 코드는 LayoutWrappingEncoder 클래스가 layout 인스턴스에게 delegate 하는 부분입니다.

package ch.qos.logback.core.encoder;

public class LayoutWrappingEncoder<E> extends EncoderBase<E> {

  protected Layout<E> layout;
  private Charset charset;
 
   // encode a given event as a byte[]
   public byte[] encode(E event) {
     String txt = layout.doLayout(event);
     return convertToBytes(txt);
  }

  private byte[] convertToBytes(String s) {
    if (charset == null) {
      return s.getBytes();
    } else {
      return s.getBytes(charset);
    }
  } 
}

layout의 doLayout 메서드는 들어오는 이벤트를 문자열로 변환합니다. 변환된 문자열은 사용자가 선택한 Encoder의 encoding 방식에 따라 바이트 배열로 변환됩니다.

PatternLayoutEncoder

PatternLayout은 가장 공통적으로 사용되는 layout이며, logback은 이를 완벽히 대체하기 위해 LayoutWrappingEncoder를 상속하며 PatternLayout을 wrapping 한 PatternLayoutEncoder를 제공합니다.

logback 버전 0.9.19 이후, FileAppender 또는 그 하위 클래스에 대해서 PatternLayout을 설정한다면 그 대신 반드시 PatternLayoutEncoder가 사용되어야 합니다.

DEPRECATED (PatternLayout)
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <layout class="ch.qos.logback.classic.PatternLayout">
    <pattern>%msg%n</pattern>
  </layout>
</appender>
to (PatternLayoutEncoder)
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%msg%n</pattern>
  </encoder>
</appender> 

Layout to Encoder에 대한 다른 예시를 확인하고 싶다면 이 링크를 참고해주시길 바랍니다.

Log Pattern 출력

로그파일 파싱을 돕기 위해 로그 파일의 최 상단에 pattern을 삽입할 수 있습니다. 이 속성은 기본적으로는 disabled 되어 있습니다. 이 속성을 활성화시키기 위해서는 PatternLayoutEncoder 내 outputPatternAsHeader 속성을 추가하여 true로 설정해야 합니다.

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>foo.log</file>
  <encoder>
    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
    <outputPatternAsHeader>true</outputPatternAsHeader> <!-- 헤더에 패턴 출력 -->
  </encoder> 
</appender>

<encoder> 태그는 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">의 shortcut입니다. <encoder>태그 하위에 <outputPatternAsHeader> 태그를 추가하여 true로 설정하여 로그파일 상단에 패턴을 출력하도록 합니다.

#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n
2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hello world
2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hi again
...

#logback.classic pattern으로 시작하여 패턴과 함께 로그파일의 첫 줄에 삽입되는 것을 확인할 수 있습니다. 

반응형
Comments