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;@Overridepublic 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();}}@Overridepublic void stop() {super.stop();System.out.println("停止........");}@Overrideprotected 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、结果

logback--进阶--05--自定义Appenders相关推荐

  1. Android进阶:自定义视频播放器开发(下)

    上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...

  2. django进阶05中间件

    原创:django进阶05中间件 django进阶05中间件 什么是中间件 django的中间件(middleware)是一个轻量级的插件系统,在django中的请求和响应中,可以利用中间件干预视图的 ...

  3. pythonos pathjson_python进阶05 常用问题库(1)json os os.path模块

    python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...

  4. Java高级进阶:自定义ClassLoader

    转载自 Java高级进阶:自定义ClassLoader 假如我们的类不在classpath下,而我们又想读取一个自定义的目录下的class,如果做呢? 读取自定义目录的类 示例读取c:/test/co ...

  5. python进阶05并发之一基本概念

    原创博客地址:python进阶05并发之一基本概念 大多编程语言,一旦涉及并发,都会比较复杂,知识点也较多(大多为历史问题,很多技术点现在非常少使用了,但语言层面也提供支持,对于这些冷门点,只需要知道 ...

  6. Android进阶之自定义View实战(二)九宫格手势解锁实现

    一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的 ...

  7. Android进阶:自定义视频播放器开发(上)

    随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为Android研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:Smal ...

  8. Logback中如何自定义灵活的日志过滤规则

    当我们需要对日志的打印要做一些范围的控制的时候,通常都是通过为各个Appender设置不同的Filter配置来实现.在Logback中自带了两个过滤器实现: ch.qos.logback.classi ...

  9. Django进阶: 如何自定义manage.py管理命令

    每次在启动Django服务之前,我们都会在终端运行python manage.py xxx的管理命令.其实我们还可以自定义管理命令,这对于执行独立的脚本或任务非常有用,比如清除缓存.导出用户邮件清单或 ...

  10. HenCoder Android 开发进阶:自定义 View 1-5 绘制顺序

    这期是 HenCoder 自定义绘制的第 1-5 期:绘制顺序 之前的内容在这里:  HenCoder Android 开发进阶 自定义 View 1-1 绘制基础  HenCoder Android ...

最新文章

  1. Maven 学习之旅
  2. mysql len hex asc_线上频出MySQL死锁问题!分享一下自己教科书般的排查和分析过程!...
  3. 恭喜神策数据客户趣店赴美 IPO 上市!
  4. Android Touch事件传递机制 二:单纯的(伪生命周期)
  5. boost::random模块使用多精度类型测试所有与浮点相关的生成器和分布的测试程序
  6. zend studio安装xdebug调试工具
  7. 20应用统计考研复试要点(part16)--应用多元分析
  8. 信息安全系统设计基础第七周学习总结
  9. 【自适应盲均衡9】基于判决反馈的多径衰落信道的盲均衡与MATLAB仿真(CMA-DFE)
  10. 消息队列RocketMQ性能测试案例
  11. linux core文件乱码,.net core在linux下图片中文乱码
  12. python面试题No2
  13. 计算机名的更改是灰色解决方案
  14. 计算机应用的核心能力,应用能力为核心的高职计算机应用分析
  15. matlab的取数组末尾n个元素的切片方法
  16. 利用python爬取图片_利用Python爬取网页图片
  17. 正则表达式清除空格和html标签中的nbsp;空格
  18. Excel自动化教程之通过python将Excel与Word集成无缝生成自动报告
  19. php后端学习重点是,后端开发新手/小白学习之-前后端如何交互详解和重点学习...
  20. SQL数据库msdb置疑(急)

热门文章

  1. 监察对象是否应该包含机关本身
  2. kyo酱的博客--回溯法
  3. 打开小米安全中心的权限管理
  4. 将两个嵌套for循环写成一个列表生成式
  5. ACM训练合集---HDU4545 魔法串
  6. (转) Windows如何区分鼠标双击和两次单击
  7. matlab中ss函数_matlab状态空间模型(matlab中如何通过ss函数和tf2ss函数将微分方程转化...)...
  8. post office 问题
  9. scrapy框架(五)
  10. Flask 消息闪现