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是谁?

首先我们来看一幅图:

ILoggerFactoryILogger这两个接口在上面我们已经知道在哪里被使用了,下面我们来看看Logging组件的具体实现部分。

不知道大家一开始看这些有没有疑惑,为什么使用了Castle Logging还要使用Log4net呢?

我们知道.net下的日志组件非常多,如:Log4net、NLog等。每一套日志组件都有部分自己特有的API,但实现的功能都大同小异,Orchard为了使API统一化而引入Castle Logging,Castle Logging并不是一个可用的日志组件,而是一套抽象的日志API

也就是说日志的记录怎么变化只要可以适配Castle Logging就可以直接与框架集成。

CastleLoggerFactory工厂中通过Castle LoggingILoggerFactory创建一个CastleLogger的实例。

那么具体的扩展就在CastleILoggerFactory中了,回顾刚才的LoggingModule

可以发现框架默认把OrchardLog4netFactory作为了CastleILoggerFactory,并且上面有一行注释,大致意思是:默认使用委托果园的日志记录器到Castle的日志记录器工厂。

到这里Logging Component的整体我们都差不多了解了。OrchardLog4netFactoryOrchardLog4netLogger就不深入的,比较简单,如果阅读还是显得比较吃力可以去Log4net官网上面去看看。

OrchardFileAppender

该类并没有在编码中出现,而是Log4net提供的一种可扩展的方式,出现在log4net.config中。具体的可以去Log4net官网上了解。

写在最后

不保证很频繁的更新本系列但保证本系列肯定会写完,最近在对一个较老的组件(系统?不知道怎么命名更贴切)以新的架构新的思想和自己的方式重新编码实现,待第一版出来之后会跟大家做分享(架构、思想上的分享)。

为了本系列的读者有更好的交流环境提供QQ群一个:299744835

 
 
分类: Orchard

Orchard Logging的更多相关文章

  1. Orchard源码分析(4.2):Orchard.Logging.LoggingModule类

    与CollectionOrderModule一样,LoggingModule也是一个Autofac模块.它以属性注入的方式给需要日志服务的对象设置Logger.    如果一个类有Orchard.Lo ...

  2. Orchard 源码探索(Log)

    简单工厂模式.抽象工厂模式和适配器模式 依赖倒置原则也叫依赖倒转原则,Dependence Inversion Principle,对抽象进行编程,不要对实现进行编程. A.高层次的模块不应该依赖于低 ...

  3. Orchard学习 01、orchard日志

    一.日志模块类图 1.ILogger接口及实现 2.ILoggerFactory接口及实现 3.其他 二.NullLogger类型     NullLogger类型是实现ILogger接口的空类型.它 ...

  4. Orchard源码:Logging

    试着用markdown写些东西.貌似博客园支持的还有问题,代码片段显示错位,还得另外上传图片.还是用普通方法写写随笔好了. Logging相对也是比较松耦合的模块,可以随时提取出来用在自己的项目中.其 ...

  5. Orchard 刨析:Logging

    最近事情比较多,有预研的,有目前正在研发的,都是很需要时间的工作,所以导致这周只写了两篇Orchard系列的文章,这边不能保证后期会很频繁的更新该系列,但我会写完这整个系列,包括后面会把正在研发的东西 ...

  6. [翻译]Orchard如何工作

    Orchard一直是博主心中神一般的存在,由于水平比较菜,Orchard代码又比较复杂看了几次都不了了之了.这次下定决心要搞懂其工作原理,争取可以在自己的项目中有所应用.为了入门先到官网去学习一下相关 ...

  7. 微软CMS项目 Orchard 所用到的开源项目

    研发了Orchard一年左右了,时常遇到瓶颈,总觉得力不从心,其实并不是基础不够,关键还是概念性的东西太多,一会儿这个概念名词,一会那个,关于Orchard的技术文档也的确很少,每次看起来总是焦头烂额 ...

  8. Orchard 微软CMS项目介绍

    我之前的项目中使用了Orchard, 它依据依赖注入的思想而做的模块化让我深深为之着迷,这里开始宣传一下这个架构. 包含的概念非常之多,我现在也不甚了解.Orchard就是自己想控制它改变它的话需要非 ...

  9. Orchard 刨析:导航篇

    之前承诺过针对Orchard Framework写一个系列.本应该在昨天写下这篇导航篇,不过昨天比较累偷懒的去玩了两盘单机游戏哈哈.下面进入正题. 写在前面 面向读者 之前和本文一再以Orchard ...

随机推荐

  1. Log4jdbc demo

    package log4jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import org.junit.Te ...

  2. jquery中 $ 和 jQuery 及 $() 的差别

    用过jquery的人都知道,jquery有两种使用方法,一种是$,另一种是jQuery,那么这两种方式在使用上有什么差别呢? 答案是这两种使用方法没什么差别,仅仅是别名而已,用$要比jQuery简短一 ...

  3. java数据结构系列之——数组(1)

    import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private ...

  4. poj 1160 Post Office (间隔DP)

    Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15966   Accepted: 8671 Desc ...

  5. freemarker定义自己的标记(三)-nested说明

    freemarker定义自己的标记 1.nested指令 是可选的,能够在<#macro>和</#macro>之间使用在不论什么位置和随意次数 2.演示样例说明 <#ma ...

  6. MyEclipse10.0 集成 SVN

    一:下载服务端和client工具   服务端安装工具:Setup-Subversion-1.6.5.msi client安装工具:TortoiseSVN 下载地址:http://subclipse.t ...

  7. Leetcode:unique_binary_search_trees

    一.     称号 给定的数目n.问:有多少种不同BST(二叉搜索树) 比如: 因为N =3,共同拥有5种独特的BST. 1          3      3       2      1 \   ...

  8. iOS:Block写递归

    首先来一个 oc 的递归: - (int)sum:(int)num { ) { return num; } ]; } 写递归算法只需要记住两点即可: 1. 有一个明确的出口 2. 不满足条件出口时,自 ...

  9. poj 2828 Buy Tickets(树状数组 | 线段树)

    题目链接:poj 2828 Buy Tickets 题目大意:给定N,表示有个人,给定每一个人站入的位置,以及这个人的权值,如今按队列的顺序输出每一个人的权值. 解题思路:第K大元素,非常巧妙,将人入 ...

  10. Facebook Hack 语言 简介

    1. Hack 是什么? Hack 是一种基于HHVM(HipHop VM 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT编译器,同时具有产生快速代码和即时编译的优点.)的 ...