Orchard源码:Logging

时间:2022-02-10 05:02:06

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

Logging相对也是比较松耦合的模块,可以随时提取出来用在自己的项目中。其实说到底它还是用的log4net。先看一下几个文件。

Orchard源码:Logging

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

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。

4.NullLogger

也是ILogger的实现,就是啥事不干,这样ILogger可以根据不同的上下文环境选择是否输出Log。

5.OrchardFileAppender

扩展了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实现动态依赖注入。