logback--进阶--05--自定义Appenders

logback–进阶–05–自定义Appenders


代码位置
https://gitee.com/DanShenGuiZu/learnDemo/tree/master/logback-learn

1、介绍

1.1、继承关系图

在这里插入图片描述

可以看到Appender 接口数核心接口

1.2、Appender 接口

Logback 将写日志记录事件的任务委派给appender组件。
Appenders组件必须实现ch.qos.logback.core.Appender接口。此接口主要方法如下:

package ch.qos.logback.core;

import ch.qos.logback.core.spi.ContextAware;
import ch.qos.logback.core.spi.FilterAttachable;
import ch.qos.logback.core.spi.LifeCycle;

public interface Appender<E> extends LifeCycle, ContextAware, FilterAttachable<E> {

    /**
     * Get the name of this appender. The name uniquely identifies the appender.
     */
    String getName();

    /**
     * This is where an appender accomplishes its work. Note that the argument is of type Object.
     * 
     * E的实际类型取决于logback模块。
     * 在logback-classic模块中,E的类型为ILoggingEvent;
     * 在logback-access模块中,类型的E为AccessEvent。
     * doAppend()方法是logback框架中比较重要的方法,它负责以合适的格式将日志记录事件输出到合适的输出设备中
     * @param event
     */
    void doAppend(E event) throws LogbackException;

    /**
     * Set the name of this appender. The name is used by other components to
     * identify this appender.
     * 
     */
    void setName(String name);

}
  1. Appender接口扩展了FilterAttachable接口。所以可以将一个或多个过滤器关联到appender实例。
  2. Appender负责输出日志记录事件。但是,他们可以将事件的实际格式委托给Layout或Encoder对象处理。
    1. 每个layout和encoder都只能与有且一个appender相关联。
    2. 某些appender具有内置或固定的事件格式。因此,它们不需要Layout或Encoder。

2、通过AppenderBase类实现一个自定义Appenders

2.1、代码

logback.xml
<configuration  >

    <!--定义变量-->
    <property scope="context" name="myHost" value="localhost"/>
    <property scope="context" name="myIP" value="127.0.0.1"/>



    <appender name="MyAppender" class="fei.zhou.logbacklearn.business.appender.MyAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <myHost>${myHost}</myHost>
        <myIP>${myIP}</myIP>
    </appender>


    <logger name="fei.zhou.logbacklearn.business.appender.Test1" additivity="false" level="INFO">
        <appender-ref ref="MyAppender"/>
    </logger>


</configuration>


Test1
public   class Test1 {
    private static final Logger log = LoggerFactory.getLogger(Test1.class);

    public static void main(String[] args) {
        log.trace("------trace");
        log.debug("------debug");
        log.info("------info");
        log.warn("------warn");
        log.error("------error");
    }
}
MyAppender

import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.encoder.Encoder;
import ch.qos.logback.core.status.ErrorStatus;

/**
 *
 * 自定义Appender
 *
 */
public class MyAppender<E> extends AppenderBase<E> {
    
    private String myHost;
    private String myIP;
    
    protected Layout<E> layout;
    protected Encoder<E> encoder;
    
    @Override
    public void start() {
        int errors = 0;
        if (this.layout == null && this.encoder == null) {
            this.addStatus(
                    new ErrorStatus("No layout && encoder set for the appender named \"" + this.name + "\".", this));
            ++errors;
        }
        if (errors == 0) {
            super.start();
        }
        
    }
    
    @Override
    public void stop() {
        super.stop();
        System.out.println("停止........");
    }
    
    @Override
    protected void append(E event) {
        // 日志转换
        String msg = encodeMessage(event);
        // 可以将这里的消息 发送到MQ中
        System.out.println("MyAppender-->" + myHost + ":" + myIP + ":处理消息--->" + msg);
    }
    
    // 日志转换
    private String encodeMessage(E logEvent) {
        if (this.encoder != null) {
            return new String(this.encoder.encode(logEvent));
        }
        return this.layout.doLayout(logEvent);
    }
    
    // ----------get set----------
    
    public void setMyHost(String myHost) {
        this.myHost = myHost;
    }
    
    public void setMyIP(String myIP) {
        this.myIP = myIP;
    }
    
    public Layout<E> getLayout() {
        return layout;
    }
    
    public void setLayout(Layout<E> layout) {
        this.layout = layout;
    }
    
    public Encoder<E> getEncoder() {
        return encoder;
    }
    
    public void setEncoder(Encoder<E> encoder) {
        this.encoder = encoder;
    }
    
}

2.2、结果

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值