【问题标题】:How does NHibernate implement optional log4net loggingNHibernate 如何实现可选的 log4net 日志记录
【发布时间】:2012-06-13 13:25:23
【问题描述】:

我记得 log4net 与 NH 一起出现并且对于 OR-Mapper 是强制性的那些日子(真的是不久前)。现在它不再是强制性的,而是可选的。

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

【问题讨论】:

  • 是如何实现的?很确定您仍然需要 Log4Net,只是不必使用它登录。
  • 是的,但你所说的“你不必这样做”正是我想要理解的。如果我针对 log4net 编译一个项目并稍后简单地删除 dll,我将不会获得可选的日志记录,而是一个损坏的软件......
  • ...因此,“你仍然需要 Log4Net”。您可以通过在配置文件中将级别设置为“FATAL”或类似的级别来降低 Log4Net 的 nhibernate 日志量,但 log4net.dll 是 NHibernate 的依赖项。
  • ...但是我如何在没有 log4net 的应用程序中使用 NH?
  • 他们通过反射加载它;不再直接引用 log4net.dll。请参阅下面的答案:)

标签: nhibernate log4net


【解决方案1】:

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

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

IInternalLogger 接口,尽管名称根本不是内部的,但它是实际的记录器接口,毫不奇怪,它准确地映射了log4netILog 接口。 NH 在需要记录时在内部询问记录器工厂。如果没有配置其他记录器,并且存在 log4net 程序集,则工厂返回 log4net 的包装器。如果你想提供自己的,你只需要提供一个记录器工厂并将其配置为:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多