NHibernate如何实现可选的log4net日志记录

时间:2012-06-13 13:25:23

标签: nhibernate log4net

我记得那些日子(不久前,真的)当log4net与NH一起出现并且是OR-Mapper必须的时候。如今它不再是强制性的,而是可选的。

我真的很想知道NHibernate是如何实现的。如果有人能用几句话来解释,那将非常感激!

2 个答案:

答案 0 :(得分:9)

NHibernate有一个ILoggerFactory来创建如下定义的记录器:

public interface ILoggerFactory
    {
        IInternalLogger LoggerFor(string keyName);
        IInternalLogger LoggerFor(System.Type type);
    } 

IInternalLogger接口,表示名称根本不是内部的,是实际的记录器接口,非常令人惊讶地映射了ILog的{​​{1}}接口。 NH内部询问记录器工厂何时需要记录。如果没有配置其他记录器,并且存在log4net程序集,则工厂将返回log4net周围的包装器。如果您想提供自己的产品,只需提供一个记录器工厂并将其配置为:

log4net

正如您所猜测的,MyLoggingLoggerFactory类必须实现 <appSettings> <add key="nhibernate-logger" value="MyLoggingLoggerFactory, MyLoggingAssembly"/> </appSettings> 。返回的记录器当然必须实现ILoggerFactory,即使不愉快的名称可能会产生误导,之前所说的是公开的。 这是他们用IInternalLogger独立的先例。另外,如果您根本不想要日志,只需从部署目录中删除log4net程序集:NH将正常降级并在内部使用空记录器。

答案 1 :(得分:1)

NHibernate不再引用log4net.dll。它确实有自己的记录器抽象层,但是,他们确实有自己的logger抽象的内置实现,专为log4net设计。

当你将NHibernate配置为使用log4net时,他们通过强制CLR使用反射加载log4net程序集来实现这一点。如果您对更多感兴趣的反射器感兴趣,请参阅NHibernate.Log4NetLogger和NHibernate.Log4NetLoggerFactory。