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

NHibernate如何实现可选的log4net日志记录,nhibernate,log4net,Nhibernate,Log4net,我记得有几天(不久前,真的)log4net与NH一起出现,并且是OR映射程序的必修课。现在它不再是强制性的,而是可选的 我真想知道NHibernate是如何做到这一点的。如果有人能用几句话来解释,那将不胜感激 NHibernate有一个iLogger工厂来创建记录器,定义如下: public interface ILoggerFactory { IInternalLogger LoggerFor(string keyName); IInternalLogg

我记得有几天(不久前,真的)log4net与NH一起出现,并且是OR映射程序的必修课。现在它不再是强制性的,而是可选的


我真想知道NHibernate是如何做到这一点的。如果有人能用几句话来解释,那将不胜感激

NHibernate有一个iLogger工厂来创建记录器,定义如下:

public interface ILoggerFactory
    {
        IInternalLogger LoggerFor(string keyName);
        IInternalLogger LoggerFor(System.Type type);
    } 
IInternalLogger
接口,它的名称根本不是内部的,它是实际的记录器接口,毫不奇怪地精确映射了
log4net
ILog
接口。NH内部询问记录器工厂何时需要记录。如果没有配置其他记录器,并且存在log4net程序集,则工厂将返回一个围绕log4net的包装器。如果您想提供自己的记录器,只需提供记录器工厂并将其配置为:

 <appSettings>
        <add key="nhibernate-logger" 
                  value="MyLoggingLoggerFactory, MyLoggingAssembly"/>
    </appSettings>

正如您所猜测的,MyLoggingLoggerFactory类必须实现
ILoggerFactory
。当然,返回的记录器必须实现
IInternalLogger
,如前所述,这是公开的,即使不满意的名称可能会产生误导。
这是他们用来独立的标准。另外,如果您根本不需要日志,只需从部署目录中删除log4net程序集:NH将正常降级并在内部使用空日志记录器。

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


当然,当您将NHibernate配置为使用log4net时,它们通过强制CLR使用反射加载log4net程序集来实现这一点。如果您对更多内容感兴趣,请使用您喜爱的反射器查看NHibernate.Log4NetLogger和NHibernate.Log4NetLoggerFactory。

如何实现?我很确定你仍然需要Log4Net,你不需要用它来登录。是的,但你所谓的“你不必”正是我想要理解的。如果我编译一个针对log4net的项目,然后简单地删除dll,我将不会得到可选的日志记录,而是一个残缺的软件……因此,“您仍然需要log4net”。您可以通过在配置文件中将级别设置为“致命”或类似的设置来降低nhibernate登录Log4Net的次数,但是
Log4Net.dll
是nhibernate的一个依赖项……但是如果没有Log4Net,我如何在我的应用程序中使用NH呢?它们通过反射加载;不再直接引用log4net.dll。见下面我的答案:)