7.encoder与layout以及convert

一、前言

上一篇文章介绍过, 在OutputStreamAppender中可以注入Encoderlayout, Layout 主要用于格式化日志文本(如 PatternLayout),适用于 控制台日志输出Encoder 负责将日志编码(通常是字符或二进制),适用于 文件、远程日志 等场景。

下面是OutputStreamAppenderEncoderlayout的注入方法

public void setEncoder(Encoder<E> encoder) {
   
   
    this.encoder = encoder;
}

public void setLayout(Layout<E> layout) {
   
   
    addWarn("This appender no longer admits a layout as a sub-component, set an encoder instead.");
    addWarn("To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.");
    addWarn("See also " + CODES_URL + "#layoutInsteadOfEncoder for details");
    LayoutWrappingEncoder<E> lwe = new LayoutWrappingEncoder<E>();
    lwe.setLayout(layout);
    lwe.setContext(context);
    this.encoder = lwe;
}

可以看出设置的layout实际也是被包装到endoer中了(LayoutWrappingEncoder), 整体看也就是只需一个encoder就行了

二、源码解读

Layout

public interface Layout<E> extends ContextAware, LifeCycle {
   
   

    /**
     * 将事件转为字符串, 这个事件一般是日志对象
     */
    String doLayout(E event);

    /**
     * 获取文件头部内容, 可以为空
     */
    String getFileHeader();

    /**
     * 返回日志事件格式化的头部内容, 可以为空
     */
    String getPresentationHeader();

    /**
     * 返回日志事件格式化的尾部内容, 可以为空
     */
    String getPresentationFooter();

    /**
     * 返回文件的尾部内容, 可以为空
     */
    String getFileFooter();

    /**
     * 获取日志内容类型
     */
    String getContentType();

}

LayoutBase

abstract public class LayoutBase<E> extends ContextAwareBase implements Layout<E> {
   
   
    protected boolean started;

    String fileHeader;
    String fileFooter;
    String presentationHeader;
    String presentationFooter;
    
    public String getContentType() {
   
   
        return "text/plain";
    }
    // ... 省略部分代码
}

这个类比较简单, 定义了头部、尾部、格式化头部、格式化头部以及生命周期的start字段, 默认日志内容是文本格式

PatternLayoutBase

abstract public class PatternLayoutBase<E> extends LayoutBase<E> {
   
   
    /**
     * 日志格式转换器链
     */
    Converter<E> head;
    
    /**
     * 日志格式
     */
    String pattern;
    
    /** 获取默认的转换器 */
    protected abstract Map<String, Supplier<DynamicConverter>> getDefaultConverterSupplierMap();
    
    /**
     * 获取有效的转换器
     */
    public Map<String, Supplier<DynamicConverter>> getEffectiveConverterMap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncleqiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值