Orchard源码:Logging

试着用markdown写些东西。貌似博客园支持的还有问题,代码片断显示错位,还得另外上传图片。仍是用普通方法写写随笔好了。html

Logging相对也是比较松耦合的模块,能够随时提取出来用在本身的项目中。其实说到底它仍是用的log4net。先看一下几个文件。编程

image

1.ILogger。俗话说面向接口编程,这个就是Orchard中Logger的接口,提供了2个方法markdown

public interface ILogger {
        bool IsEnabled(LogLevel level);
        void Log(LogLevel level, Exception exception, string format, params object[] args);
    }

2.CastleLogger设计

ILogger的默认实现,系统就是用的这个,看名称是CastleLogger,不要被迷惑。系统中Castle.Core.Logging.ILogger也是一个接口,log4net才是真正的实现。代理

3.LoggingExtensions日志

ILogger的一些扩展方法,如Error,Debug,Warning等,就是不一样的LogLevel。orm

4.NullLoggerhtm

也是ILogger的实现,就是啥事不干,这样ILogger能够根据不一样的上下文环境选择是否输出Log。对象

5.OrchardFileAppenderblog

扩展了log4net 的 RollingFileAppender。这样当日志文件被锁定时,它能够输出到另外的文件中。

6.ILoggerFactory,CastleLoggerFactory,NullLoggerFactory

第一个是是接口,后2个是实现

7.OrchardLog4netFactory

这个Factory 继承的是AbstractLoggerFactory,这是一个真的“Factory”,CastleLoggerFactory是他的一层代理

8.LoggingModule

用于注册Logging模块

 

以上是大体介绍,光看名字就知道用了好几个design pattern。瞬间感受高大上。

 

这样设计显而易见的是能够方便实现本身的ILoggerFactory和ILogger。另外一个是在注入ILogger时候,能够把当前使用Ilogger的组件如注给它。

普通log4net实例化方法:

private static readonly ILog logger=LogManager.GetLogger(typeof(类))

这样的话就查看日志文件就能够知道日志是哪一个类生成的

Orchard中的依赖注入

 public class Thing {
        public ILogger Logger { get; set; }
    }

在注入的时候已经把Thing这个类关联到了这个ILogger中。而不用每次都去指定具体的类。

这种运行时动态构造对象在Orchard中使用不少。请查看LoggingModule.AttachToComponentRegistration方法。详细以后会专门介绍如何使用Autofac实现动态依赖注入。

相关文章
相关标签/搜索