2018/2/16 解析Logback的AppenderBase源码,并举一反三的实现Logback扩展功能的思路,以及它的实际业务应用场景
在学习Logback的过程中,知道了它有一个可以将日志往第三方数据源写的功能,这个功能的实现就是这个AppenderBase类,不禁想看看它的源码。
下面是AppenderBase类的所有子类(也就是它的具体实现类,毕竟它本身是一个抽象类),它对于JMS的支持,以及SSL加密的支持倒没什么,但是它对于邮件服务的支持只有SMTP,就是说POP3和IMAP都不支持咯?

在同步的AppenderBase的里,我们可以通过CyclicBufferAppender类来对存储多条日志信息的CyclicBuffer的最大长度进行设置,它自己有一个默认的maxSize = 512,

当然了,这个肯定是通过配置文件进行设置的;

数组类型是个泛型

AppenderBase里唯一的抽象方法,配合方法名以及传入参数的变量名来看,应该就是当日志事件触发时会调用的方法;

看了一下SMTPAppenderBase(也就是对于SMTP支持的功能类)的源码,也验证了我这一想法;

还可以复写AppenderBase的start方法来进行一些初始化的工作;

发现了Appender里除了AppenderBase还有另一个实现类,看名字就是异步的AppenderBase咯;

点进它的实现类可以看到,用了一个BlockingQueue做了一个队列,并且设置了一个默认长度,256,也就是队列里可以放256个任务(不过应该是可以配置的),剩下的就会被丢弃,另外没有看到线程池的实现,奇怪了,放到哪里了呢?
举一反三一下,这里面LogBack对于第三方数据源的支持都是通过继承了AppenderBase和UnsynchronizedAppenderBase这两个抽象类通过复写它们的抽象方法appender来进行扩展的,所以我们完全也可以自己创建一个类继承AppenderBase或者UnsynchronizedAppenderBase来实现一些对其它数据源的扩展,比如redis,es,kafuka等等这些。
发散思考一下,在实际业务场景中,特别是微服务的情况下,如果我们要把一个服务的日志输出到另一个数据源,靠Logback的支持根本不够,因为它支持的服务实在是太少了,那么我们肯定需要在每台相应服务里都配置Logstash或者FileBeats之类,实在是太麻烦了,但如果我们自己扩展下,就单单我们自己的服务来说,只需要复制粘贴我们自己写好的工具类,然后配置一下即可;
2018/2/16 解析Logback的AppenderBase源码,并举一反三的实现Logback扩展功能的思路,以及它的实际业务应用场景的更多相关文章
- 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了
一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解> ...
- Spring PropertyResolver 占位符解析(二)源码分析
Spring PropertyResolver 占位符解析(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) ...
- Java源码阅读的真实体会(一种学习思路)
Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...
- Java源码阅读的真实体会(一种学习思路)【转】
Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+ ...
- Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例
概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet.内容包括:第1部分 HashSet介绍第2部分 HashSe ...
- 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错
原文网址:http://www.cnblogs.com/skywang12345/p/3311252.html 概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学 ...
- Android 进阶16:IntentService 使用及源码解析
It's time to start living the life you've only imagined. 读完本文你将了解: IntentService 简介 IntentService 源码 ...
- java 8 Hashmap深入解析 —— put get 方法源码
每个java程序员都知道,HashMap是java中最重要的集合类之一,也是找工作面试中非常常见的考点,因为HashMap的实现本身确实蕴含了很多精妙的代码设计. 对于普通的程序员,可能仅仅能说出Ha ...
- Python解析Pcap包类源码学习
0x1.前言 在现场取证遇到分析流量包的情况会比较少,虽然流量类设备原理是把数据都抓出来进行解析,很大一定程度上已经把人可以做的事情交给了机器自动完成. 可用于PCAP包分析的软件比如科来,W ...
随机推荐
- [译]curl_multi_add_handle
NAMEcurl_multi_add_handle - add an easy handle to a multi session添加easy handle到multi session中 SYNOPS ...
- jacaScript数组
1.var arr=['1','2','3'] typeof arr (判断数组类型) print(arr)打印数组内容 2.arr[100]='x', 数组中间自动添加,alert(arr. ...
- IIS 安装了.net framework 4.0/4.5 却找不到相应应用程序池
通常情况下是因为没注册造成的,有些安装包会自己帮你注册上有些不会,感觉略坑. 注册方法:在计算机中点击 开始菜单–>运行 拷贝以下内容运行一下即可. C:\WINDOWS\Microsoft.N ...
- wget安装更新
#查看当前wget版本信息 wget -V #下载 wget https://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz #解压 tar xvf wget-1.19.t ...
- 最近面试oracle 数据库的知识点
1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...
- redis-3.0.1 sentinel 主从高可用 详细配置
最近项目上线部署,要求redis作高可用,由于redis cluster还不是特别成熟,就选择了redis sentinel做高可用.redis本身有replication,实现主从备份.结合sent ...
- flask的基本搭建
from flask import Flask app = Flask(__name__) @app.route("/")def index(): return "ok& ...
- CREATE DOMAIN - 定义一个新域
SYNOPSIS CREATE DOMAIN name [AS] data_type [ DEFAULT expression ] [ constraint [ ... ] ] where const ...
- https://quotefancy.com/ 经典句子(英语) 真是特别好~
https://quotefancy.com/ 经典句子(英语)
- torch.nn.Linear()函数的理解
import torch x = torch.randn(128, 20) # 输入的维度是(128,20)m = torch.nn.Linear(20, 30) # 20,30是指维度output ...