天天看點

(四)Logback中的Encoder

一、什麼是Encoder?

Encoder負責轉換日志事件為位元組數組并将位元組數組輸出到輸出流中,編碼器是在logback 0.9.19版本中引入的,以前老版本中大多數appenders依賴layout轉換日志事件,然後使用java.io.Writer寫入。先前版本中,使用者通常會在FileAppender中嵌PatternLayout,從logback 0.9.19版本開始,FileAppender和它的子類隻需配置Encoder即可,而不再需要配置Layout。

編碼器能完全控制寫入什麼位元組以及什麼時候寫入到輸出流,下面是Encoder接口:

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;
}
           

二、Encoder分類

1、LayoutWrappingEncoder

直到logback 0.9.19版本,許多輸出源依賴于Layout執行個體控制日志輸出格式。因為基于Layout需要大量的代碼,是以logback為編碼器提供了一種方式與布局互相操作。LayoutWrappingEncoder縮小了encoders和layouts之間的差距,它實作了Encoder接口并且包裝了Layout,并把轉換日志事件對象的任務委托給Layout。

下面是LayoutWrappingEncoder類的部分代碼,闡述了如何委托給包裝的layout。

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);
    }
  } 
}
           

2、PatternLayoutEncoder

PatternLayout是最常用的布局,logback提供了通用案例:PatternLayoutEncoder,該類對LayoutWrappingEncoder進行了擴充,從Logback 0.9.19版本開始,無論FileAppender及其子類是否配置了PatternLayout,PatternLayoutEncoder都會被使用,請參考logback相關錯誤代碼條目。

2.1 Output pattern string as header(将輸出格式字元串作為頭部資訊)

為了促進日志檔案的解析,logback可以在日志檔案上插入日志輸出格式,該特性預設不可用,通過設定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>
           

日志輸出類似如下:

#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"開頭的行就是插入的日志格式行。

繼續閱讀