Common.Logging源码解析一
Common.Logging是Apache下的一个开源日志接口组件,主要用于切换不同的日志库,因为当前流行的日志库有很多向log4j、log4net(log4j的.net版本)等等,所以为了能灵活的切换不同的日志组件以适应不同的系统(在系统的迭代过程中),所以设计了Common.Logging这个组件,下面废话不多说开始解析这个组件。
1、架构分析
首先大致浏览了下这个组件的架构

Common.Logging.Core

Common.Logging

观察文件类型发现以下两点:
(1)、整个组件采用面向接口编程
(2)、抽象工厂,为了解耦必然会采用工厂,通过工厂返回接口(当然这是次要的原因,主要的还是所有的不同的日志实例是相关或者相互依赖的对象)
(3)、必然有一个Manager作为主接口
(2)、(3)点如果不明白请参考抽象工厂(AbstractFactory)模式-创建型模式

2、(LogManager)主接口分析
所谓主接口,就是客户端通过这个类操作日志实例,所以这个类就肩负了所有的初始化工作,下面开始分析LogManager做了哪些初始化工作,以及大致的顺序是怎么样的?
(1)、初始化配置文件阅读器
通过静态构造函数初始化配置文件阅读器实例,关于为什么要用静态构造函数,主要是为了解决多线程的问题,因为web应用程序是多线程的所以通过静态构造函数能解决多线程的问题,编译器会给它加锁。


DefalutConfigurationReader.cs --这个类默认采用的是去读Web.config文件的方法来读取日志以及日志接口的配置

当编译器执行ConfigurationManager.GetSection()方法时,会触发ConfigurationSectionHandler类的
这个方法回去读取配置文件从而生成LogSetting实例。

ok,到这一步,就通过构造函数设置完全局的配置文件阅读器实例,下面通过

就能调用配置文件阅读器实例了,这个实例并不包含配置文件的信息,只是存有如何读取配置文件的方法
(2)、生成日志实例工厂类

通过这个属性来创建日志实例工厂类


(3)、开发接口给外部方法

通过这三个方法就可以通过日志实例工厂类来获取对应的日志实例!
ok,整个(LogManager)主接口分析完毕!
Common.Logging源码解析一的更多相关文章
- Common.Logging源码解析二
Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...
- [源码解析] 并行分布式任务队列 Celery 之 多进程模型
[源码解析] 并行分布式任务队列 Celery 之 多进程模型 目录 [源码解析] 并行分布式任务队列 Celery 之 多进程模型 0x00 摘要 0x01 Consumer 组件 Pool boo ...
- [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State
[源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State 目录 [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练 ...
- [源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer
[源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer 目录 [源码解析] PyTorch 分布式(11) ----- Dis ...
- [源码解析] PyTorch 分布式之弹性训练(5)---Rendezvous 引擎
[源码解析] PyTorch 分布式之弹性训练(5)---Rendezvous 引擎 目录 [源码解析] PyTorch 分布式之弹性训练(5)---Rendezvous 引擎 0x00 摘要 0x0 ...
- [源码解析] TensorFlow 分布式环境(8) --- 通信机制
[源码解析] TensorFlow 分布式环境(8) --- 通信机制 目录 [源码解析] TensorFlow 分布式环境(8) --- 通信机制 1. 机制 1.1 消息标识符 1.1.1 定义 ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- solr&lucene3.6.0源码解析(四)
本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...
- Flume-ng源码解析之Source组件
如果你还没看过Flume-ng源码解析系列中的启动流程.Channel组件和Sink组件,可以点击下面链接: Flume-ng源码解析之启动流程 Flume-ng源码解析之Channel组件 Flum ...
随机推荐
- 关于使用ModelSim中编写testbench模板问题
对于初学者来说写Testbench测试文件还是比较困难的,但Modelsim和quartus ii都提供了模板,下面就如何使用Modelsim提供的模板进行操作. Modelsim提供了很多Testb ...
- 如何快速理解JavaScript 中重要语句for循环
一.基本结构:for(起始状态:判断条件:状态改变){ 执行语句: } 执行顺序:for(var i=1;i<3;i++){ alert(i); } 1.判断条件 2.执行语句 3. ...
- PROFINET有什么用
“工业4.0”是当前制造业最热门的话题,所以不谈这个话题都不好意思跟同行们打招呼.“工业4.0”里面的一个重要内容是智慧工厂,工厂流水线设备之间通信,无论是传统的有线连接还是先进的无线连接与分布式控制 ...
- [Git]07 如何在提交过程中忽略某些文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表.通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等.我们可以创建一个名为 .gitignor ...
- 极光的开源礼物「Aurora IMUI」
今日,奉上我们拙作,仅为开源世界献出绵薄之力. Aurora IMUI,一个通用的即时通讯(IM)UI 库.不局限于任何 IM SDK. 本 UI 库提供了消息列表.输入视图等常用组件. 初心 过去的 ...
- get和post方式请求数据,jsonp
get方式请求数据: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #289c97 } p.p2 { ma ...
- hdu3336 Count the string kmp+dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 很容易想到用kmp 这里是next数组的应用 定义dp[i]表示以s[i]结尾的前缀的总数 那么 ...
- js 正则表达式验证
验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9 ...
- Brief introduction to Cassandra 【Cassandra简介】
From wikipedia https://en.wikipedia.org/wiki/CAP_theorem In theoretical computer science, the CAP t ...
- Natas Wargame Level 9 Writeup(bash injection)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArAAAAClCAYAAACkwM63AAAABHNCSVQICAgIfAhkiAAAIABJREFUeF