Orchard 刨析:Logging
最近事情比较多,有预研的,有目前正在研发的,都是很需要时间的工作,所以导致这周只写了两篇Orchard系列的文章,这边不能保证后期会很频繁的更新该系列,但我会写完这整个系列,包括后面会把正在研发的东西跟大家一起分享(架构、思想上的分享)。
今天我们来看一看Orchard中的Logging Component。
日志在Orchard中的使用


像这样的代码大家在Orchard中肯定经常见到,那么NullLogger.Instance是什么?大量使用依赖注入的Orchard会把真正的日志记录器放在一个静态变量里面吗?答案肯定是否定的,我们来看一看NullLogger。

NullLogger明显是空的,那么ILogger到底是谁?怎么进入到服务中的?
LoggingModule
不知道大家对“Orchard 刨析:前奏曲”中的CachingModule还有没有印象,Orchard用了类似的机制,只不过这一次把构造函数注入变成了属性注入。

在Load方法我们可以看到Orchard把一个CreateLogger委托(方法)注册成为了一个ILogger接口,也就是在服务需要(请求)类型为ILogger的服务时候会执行这个委托,这个委托会返回一个ILogger实例。
我们来看一看这个神奇的CreateLogger委托。

方法比较简单,解析一个ILoggerFactory并通过LoggerFactory为请求服务的类型创建出一个Logger。
对于ILogger由谁创建的疑惑我们揭开了,但是怎么确保它是以属性输入的方式被注入进来的?下面我们接着看。

这个方法比较简单,在AttachToComponentRegistration方法中调用BuildLoggerInjectors方法生成注入的动作,并在服务被激活(服务实例创建完成后)之后执行这些委托。

BuildLoggerInjectors方法稍显复杂些,但对经常使用反射的人来说很快就能看得明白。
主要的流程如下:
1.获取服务类型中所有符合约定的属性(具有Set方法、必须是Public、是一个实例、属性类型是ILogger、不具备索引参数)
2.遍历这些属性
3.解析ILogger服务(实则调用CreateLogger)
4.把ILogger的实例设置到该属性上。
到这边ILogger是怎么被创建的我们已经明白了,那么为什么需要NullLogger.Instance呢?
为什么需要NullLogger
其实原因很简单,日志组件不一定是必要的,也就是说在框架运行起来的时候压根我们就没有日志组件,如果没有日志组件那么在解析ILogger的时候肯定是失败的(ILogger为null),这时候如果我们在服务中使用ILogger的实例肯定是未引用对象到实例,否则就需要判断ILogger是否为null在进行日志记录,岂不麻烦。所以NullLogger.Instance的用意就在解决这个问题。
ILogger是谁?
以上我们弄明白了ILogger怎么来的下面我们来看看ILogger是谁?
首先我们来看一幅图:

ILoggerFactory和ILogger这两个接口在上面我们已经知道在哪里被使用了,下面我们来看看Logging组件的具体实现部分。
不知道大家一开始看这些有没有疑惑,为什么使用了Castle Logging还要使用Log4net呢?
我们知道.net下的日志组件非常多,如:Log4net、NLog等。每一套日志组件都有部分自己特有的API,但实现的功能都大同小异,Orchard为了使API统一化而引入Castle Logging,Castle Logging并不是一个可用的日志组件,而是一套抽象的日志API。
也就是说日志的记录怎么变化只要可以适配Castle Logging就可以直接与框架集成。

CastleLoggerFactory工厂中通过Castle Logging的ILoggerFactory创建一个CastleLogger的实例。
那么具体的扩展就在Castle的ILoggerFactory中了,回顾刚才的LoggingModule:

可以发现框架默认把OrchardLog4netFactory作为了Castle的ILoggerFactory,并且上面有一行注释,大致意思是:默认使用委托果园的日志记录器到Castle的日志记录器工厂。
到这里Logging Component的整体我们都差不多了解了。OrchardLog4netFactory和OrchardLog4netLogger就不深入的,比较简单,如果阅读还是显得比较吃力可以去Log4net官网上面去看看。
OrchardFileAppender

该类并没有在编码中出现,而是Log4net提供的一种可扩展的方式,出现在log4net.config中。具体的可以去Log4net官网上了解。
写在最后
不保证很频繁的更新本系列但保证本系列肯定会写完,最近在对一个较老的组件(系统?不知道怎么命名更贴切)以新的架构新的思想和自己的方式重新编码实现,待第一版出来之后会跟大家做分享(架构、思想上的分享)。
为了本系列的读者有更好的交流环境提供QQ群一个:299744835
Orchard 刨析:Logging的更多相关文章
- Orchard 刨析:导航篇
之前承诺过针对Orchard Framework写一个系列.本应该在昨天写下这篇导航篇,不过昨天比较累偷懒的去玩了两盘单机游戏哈哈.下面进入正题. 写在前面 面向读者 之前和本文一再以Orchard ...
- Orchard 刨析:Caching
关于Orchard中的Caching组件已经有一些文章做了介绍,为了系列的完整性会再次对Caching组件进行一次介绍. 缓存的使用 在Orchard看到如下一段代码: 可以看到使用缓存的方法Get而 ...
- Orchard 刨析:前奏曲
Orchard中大量使用了依赖注入,而实现依赖注入的组件就是Autofac,它在Orchard中扮演者非常重要的角色,多租户如是,模块如是,工作区也如是.今天就来讲讲Autofac在Orchard中的 ...
- Learning Cocos2d-x for WP8(2)——深入刨析Hello World
原文:Learning Cocos2d-x for WP8(2)--深入刨析Hello World cocos2d-x框架 在兄弟篇Learning Cocos2d-x for XNA(1)——小窥c ...
- MapReduce源码刨析
MapReduce编程刨析: Map map函数是对一些独立元素组成的概念列表(如单词计数中每行数据形成的列表)的每一个元素进行指定的操作(如把每行数据拆分成不同单词,并把每个单词计数为1),用户可以 ...
- Apollo 刨析:Localization
九月 30 2014 11:27 上午 admin 0 Comments 今天我们来看一看Apollo中的Localization Component. 本地化在Apollo中的使用 像这样的 ...
- 30s源码刨析系列之函数篇
前言 由浅入深.逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美. 本系列是对名库 30SecondsOfCode 的深入刨析. 本篇是其中的函数篇,可以在极短的时间 ...
- Golang 性能测试 (3) 跟踪刨析 golang trace
简介 对于绝大部分服务,跟踪刨析是用不到的.但是如果遇到了下面问题,可以不妨一试: 怀疑哪个协程慢了 系统调用有问题 协程调度问题 (chan 交互.互斥锁.信号量等) 怀疑是 gc (Garbage ...
- 温故知新-多线程-深入刨析volatile关键词
文章目录 摘要 volatile的作用 volatile如何解决线程可见? CPU Cache CPU Cache & 主内存 缓存一致性协议 volatile如何解决指令重排序? volat ...
随机推荐
- 08_Queue(队列UVa 10128)
问题描述:n(1<=n<=13)个身高均不相等的人站成一排,从左向右看能看见L个人,从右向左看能看见R个人,问这个队列有多少种排法? 问题分析: 1.n个人的身高可设为1~n, 2.设d ...
- 快速理解Kafka分布式消息队列框架
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ ==是什么 == 简单的说,K ...
- WEB安全--CSRF剖析
CSRF攻击:攻击者构造合法的HTTP请求,随后利用用户的身份操作用户帐户的一种攻击方式. 一.CSRF攻击原理CSRF的攻击建立在浏览器与Web服务器的会话中:欺骗用户访问URL.二.CSRF攻击场 ...
- ZBrush中的笔刷该怎样制作
ZBrush给用户提供了许多的常用笔刷,我们可以使用这些笔刷自由地发挥创意.为了让雕刻速度更快,模型刻画更细致我们常常也会创建自定义笔刷,本文教您在ZBrush中制作笔刷. 查看更多内容请直接前往:h ...
- iOS开发之——制作framework静态库教程
环境: 硬件:macbook air 系统:OSX EI Capitan 版本:10.11.3 xcode : Version 7.2.1 (7C1002) 最近在做ios的静态库(据说framewo ...
- is A和has A的区别
is A has A Red is A Color: class Red extends Color{} class Blue extends Color{} class Yellow exrends ...
- POJ 2142 The Balance【扩展欧几里德】
题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当 ...
- Unity物理系统的触发器
如何触发触发器函数? 触发器中相互的,当其中一个是触发器,两个物体进入碰撞,双方的触发器函数都会触发. 两个碰撞盒穿入? 解决办法:给其中一个添加刚体 触发器的物理配置 以上是个人理解,看过API之后 ...
- Android 动态加载 (三) PAK 详解
pak文件经常出现于游戏的安装目录中,其实pak文件是一种特殊的游戏压缩文件,用于压缩声音.图片等资料.由于pak文件专门针对游戏设计文件结构,pak文件就是将多个文件(图片.音乐.文本)打包为一个单 ...
- 将TP引擎改为smarty引擎
在common/config文件里设置'TMPL_ENGINE_TYPE'=>'Smarty'即可,但要注意,在模板文件里的css样式{}要用一对{literal}{/literal}标签包裹, ...