试着用markdown写些东西。貌似博客园支持的还有问题,代码片断显示错位,还得另外上传图片。仍是用普通方法写写随笔好了。html
Logging相对也是比较松耦合的模块,能够随时提取出来用在本身的项目中。其实说到底它仍是用的log4net。先看一下几个文件。编程
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实现动态依赖注入。