Log4net Logger模块 结构

 

 

1.LogManager  -- facade 用于与系统外部交互。

1.1 GetLogger  获取命名日志对象

    • 获取assamble,也可以通过repository。
    • 调用loggerManager
    • 对得到 Ilogger 对象进行包装。
      • ?为什么不在loggerManager中进行包装呢?这里的包装器,又不能进行配置
        • LoggerManager是内部Logger的管理者,Logger并不适合直接把用于外部系统。
      • warpper 模式可以动态的为对象附加新的职责,但是如果不能配置岂不是有点囧?
        • ILoggerWarpper并不是包装模式!

LogManager获得的是ILog 对象

LoggerManager 获得的是ILogger对象

当获得到ILogger对象后使用WrapperMap 对象去lookup ILog

 

2.WrapperMap

Maps between logger objects and wrapper objects.

?这里是不是Warpper模式,还是一个Factory

构造函数使用了一个 WrapperCreationHandler  用于创建wrapper

m_repositories维护了 当前所有Logger实例和Wapper实例的对应关系。

    • m_repositories是一个Hashtable,包含了Logger.Repository <—>Hashtable (包含当前Logger 和 wrapper)的对应关系。
    • 这么设计的好处?
      • 目前认为是可以在一个统一的地方记录下所有logger实例和wrapper的对应关系,由于对应关系是多对多,所以这个记录结构也就是现在这样的了。
      • Repository到底是什么用呢?难道只是访问关系的秘要吗?
        • 也许是这样,如果单纯的使用Key话,就不能实现那种继承关系了,现在这样使用这个类的话,那么就可以实现类似
        • loggerA 拥有 RepositoryA级别的对应关系,RepositoryB :RepositoryA ,那么LoggerB,拥有LoggerA的关系,及自己的关系。?
        • 但是关系是包含Logger的实例的,这样的关系如何处理呢?
      • 看来另一种考虑也许更好,Repositories表示的是ILogger所属的库,所以这里维护的是,库s--》某个库---》logger----对应---warpper

!由于WrapperMap是总负责所有Logger,Wrapper的对应关系的,所有这种设计可以很好的管理所有的logger,为每一个logger注册了一个LoggerRepositoryShutdownEventHandler

处理程序,在Logger.Repository.ShutdownEvent 事件触发时,可以自动维护好关系。

 

3.WrapperCreationHandler 

WrapperCreationHandler  是一个delegate , 声明方式如下

public delegate ILoggerWrapper WrapperCreationHandler(ILogger logger);

这里实现了一个策略模式用于封装Map过程。

 

4.LoggerRepositoryShutdownEventHandler。

private readonly LoggerRepositoryShutdownEventHandler m_shutdownHandler;

 

5.ILog,ILoggerWrapper,ILogger

ILogger是系统内部元素

ILog 是面向外部系统使用的元素,所以组合了ILogger,实现了更友好的处理方式。

ILoggerWrapper 是对ILogger的包装,ILog:ILoggerWrapper

这部分需要具体查看一个日志记录器的实现。

 

6.LoggerManager

6.1 使用 RepositorySelector 获取Ilogger实例

loggerManager中维护了一个 RepositorySelector ,用来获取Ilogger

 

7.IRepositorySelector

Interface used by the <see cref="LogManager"/> to select,create the <see cref="ILoggerRepository"/>.

每一个实现了IRepositorySelector  的class

    • 必须维护一个 Assamble to ILoggerRepository 的Hashtable
    • 必须维护一个 repositoryName to ILoggerRepository  的Hashtable

具体Selector 的生成 需要读取 Assamble有关。

用于获取ILoggerRepository 的实例。

8.ILoggerRepository

This interface is used by the <see cref="LogManager"/> to obtain <see cref="ILog"/> interfaces.

维护着Loger,Level,app

转载于:https://www.cnblogs.com/zhuispeed/archive/2009/11/14/1603181.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值