java日志框架系列(6):logback框架encoder详解

1.Encoder

1.encoder功能

Encoder 负责两件事,一是 把事件转换为字节数组,二是 把字节数组写入输出流。

注意:在logback 0.9.19 版之前没有 encoder。

在之前的版本里,多数 appender 依靠 layout 来把事件转换成字符串并用 java.io.Writer 把字符串输出。在之前的版本里,用户需要在 FileAppender里嵌入一个 PatternLayout。 而从 0.9.19 版开始,FileAppender 和其子类使用 encoder,不接受 layout

encoder相比layout的优点:

 2.Encoder接口详解

Encoder负责把事件转换为字节数组,并把字节数组写到合适的输出流。因此,encoder可以控制在什么时候、把什么样的字节数组写入到其拥有者维护的输出流中。Encoder接口有两个实现类,LayoutWrappingEncoder与PatternLayoutEncoder。

Encoder接口代码如下:

1package ch.qos.logback.core.encoder; 2import java.io.IOException; 3import java.io.OutputStream; 4import ch.qos.logback.core.spi.ContextAware; 5import ch.qos.logback.core.spi.LifeCycle; 6public interface Encoder<E> extends ContextAware, LifeCycle { 7/** 8* This method is called when the owning appender starts or 9* whenever output needs to be directed to a new OutputStream, 10* for instance as a result of a rollover. 11*/ 12void init(OutputStream os) throws IOException; 13/** 14* Encode and write an event to the appropriate {@link OutputStream}. 15* Implementations are free to differ writing out of the encoded 16* event andinstead write in batches. 17*/ 18void doEncode(E event) throws IOException; 19/** 20* This method is called prior to the closing of the underling 21* {@link OutputStream}. Implementations MUST not close the underlying 22* {@link OutputStream} which is the responsibility of the 23* owning appender. 24*/ 25void close() throws IOException; 26}

1.LayoutWrappingEncoder类详解

 下面通过LayoutWrappingEncoder类的部分源码,阐述如何把工作委托给Layout:

1package ch.qos.logback.core.encoder;import java.io.IOException; 2import java.nio.charset.Charset; 3import ch.qos.logback.core.Layout; 4public class LayoutWrappingEncoder<E> extends EncoderBase<E> { 5  protected Layout<E> layout; 6  private Charset charset; 7  public void doEncode(E event) throws IOException { 8    String txt = layout.doLayout(event); 9    outputStream.write(convertToBytes(txt)); 10    outputStream.flush(); 11  } 12  private byte[] convertToBytes(String s) { 13    if (charset == null) { 14      return s.getBytes(); 15    } else { 16      return s.getBytes(charset); 17    }   }}

doEncode()方法首先让被包裹的 layout 把传入的事件转换成字符串,再根据用户选择的字符集编码把字符串转换成字节,然后把自己写入其拥有者 appender 指定的输出流,输出 流被立即冲出(flush)。

 2.PatternLayoutEncoder类详解

由于PatternLayout是最常用的Layout,因此logback提供了PatternLayoutEncoder,它扩展了LayoutWrappingEncoder,且仅使用PatternLayout。

注意:从logback0.9.19版起,FileAppender或其子类(比如,RollingFileAppender)在只要用到PatternLayout时,都必须换成PatternLayoutEncoder。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang