(四)Logback中的Encoder

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: ncoder负责转换日志事件为字节数组并将字节数组输出到输出流中,编码器是在logback 0.9.19版本中引入的,以前老版本中大多数appenders依赖layout转换日志事件,然后使用java.io.Writer写入。先前版本中,用户通常会在FileAppender中嵌PatternLayout,从logback 0.9.19版本开始,FileAppender和它的子类只需配置Encoder即可,而不再需要配置Layout。

一、什么是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"开头的行就是插入的日志格式行。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
缓存 Java API
logback配置
一、logback介绍 logback分成三个模块:logback-core,logback- classic,logback-access。 logback-core:提供了logBack的核心功能,是另外两个组件的基础; logback-classic:实现了SLF4J API; logback
704 0
|
Java API 网络性能优化
NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
报错日志: java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy at ch.
11179 0
|
12月前
|
XML 安全 Java
logback的使用和配置|logback比log4j的优点|logback是一个更好的log4j
logback的使用和配置|logback比log4j的优点|logback是一个更好的log4j
|
XML 安全 Oracle
logback的使用和logback.xml详解
logback的使用和logback.xml详解
|
算法 Java API
(三)Logback中的Appender
(三)Logback中的Appender
|
安全 Java API
(一)Logback介绍及架构
(一)Logback介绍及架构
|
监控 Java Shell
(二)Logback配置
Logback通过加载配置文件的方式来初始化配置,配置文件的加载顺序如下: 1)Logback首先会去类路径下找名为logback-test.xml的文件。 2)如果没有找到如上文件,会去类路径下找名为logback.groovy的文件。 3)如果没有找到如上文件,会去类路径下找名logback.xml的文件。
(二)Logback配置
(六)Logback中的Filter
规律型过滤器继承自Filter抽象类,该类主要由带有ILoggingEvent参数的decide()方法组成。多个过滤器会基于三进制规则进行排序,每个过滤器的decide(ILoggingEvent event)方法依次会被调用,该方法返回FilterReply的枚举值,例如:DENY、NEUTRAL、ACCEPT。如果方法返回值为DENY,那么日志对象会被终止而不会被其它过滤器访问。
|
Java jenkins Linux
Logback使用总结
整理了下logback的常用点功能,并记录了一些在使用过程中的疑问,和问题的排错过程,防止自己再犯类似错误,也希望对路过的你有所帮助。
639 0
|
机器学习/深度学习
Poly-encoder 架构
Poly-encoder 架构
316 0
Poly-encoder 架构