【问题标题】:Can't get NHibernate and Log4Net to generate logging.无法让 NHibernate 和 Log4Net 生成日志记录。
【发布时间】:2011-01-07 02:14:58
【问题描述】:

我无法获得 NHibernate 或我的应用程序的任何日志记录。我尝试了所有我能想到的方法,但没有任何效果!

这是我的代码:

using System.Reflection;
using NHibernate.Cfg;

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
namespace NHibernate_Log4Net
{
    class Program
    {
        static void Main(string[] args)
        {
            var cfg = new Configuration()
                    .Configure()
                    .AddAssembly(Assembly.GetCallingAssembly());
        }
    }
}



namespace NHibernate_Log4Net.Model
{
    public class Item
    {
        public int Id { get; set; }
        public int Title { get; set; }
        public int Alias { get; set; }
    }
}

Item.hbm.xml 文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate_Log4Net.Model.Item" assembly="NHibernate_Log4Net" auto-import="false">
  <class name="User" table="Users">
    <id name="Id">
      <generator class="Native"/>
    </id>

    <property name="Title" length="255" not-null="true" />
    <property name="Alias" length="255" not-null="true" />
  </class>
</hibernate-mapping>

Log4Net.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<log4net debug="false">

  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="log4netLogger.log" />
    <appendToFile value="false" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1000KB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c - %m%n" />
    </layout>
  </appender>

  <appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%-5p %m - %c -%n" />
    </layout>
  </appender>
  <appender name="TraceAppender" type="log4net.Appender.TraceAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c - %m%n" />
    </layout>
  </appender>

  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date - %message%newline"/>
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFileAppender" />
    <appender-ref ref="OutputDebugStringAppender" />
    <appender-ref ref="TraceAppender" />
  </root>
  <logger name="NHibernate" additivity="false">
    <level value="FATAL"/>
    <appender-ref ref="RollingFileAppender" />
    <appender-ref ref="OutputDebugStringAppender" />
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="TraceAppender" />
  </logger>
  <logger name="NHibernate.SQL" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="RollingFileAppender" />
  </logger>
  <!-- 
      NHibernate.Loader.Loader logs diagnostic stuff and SELECTs. 
      You can use either logger, or both, depending on you needs.
    -->
  <logger name="NHibernate.Loader.Loader" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="RollingFileAppender" />
  </logger>


</log4net>

NHibernate 抛出类 Users 不存在的错误。这是意料之中的,但为什么我没有看到来自 NHibernate 的任何日志记录?

(我可以自己记录,但我看不到 NHibernate 的任何日志)。

【问题讨论】:

    标签: nhibernate logging log4net


    【解决方案1】:

    配置文件需要匹配可执行文件,你的可执行文件是不是名为Log4Net.exe?

    【讨论】:

    • 我的可执行文件名称是 NHibernate_Log4Net.exe 但 Log4Net.config 不是 app.config,但它在 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch =真)]。
    • 我认为没有人会为您加载它。尝试将其命名为 NHibernate_Log4Net.exe.config。
    • 我试过了,它什么也没做。正如我上面所说,我认为不需要。
    • 您是否尝试将属性放入您的 AssemblyInfo.cs 文件而不是主类中?我想知道它是否与声明属性的位置有关?
    • 您是否尝试过绝对引用 log4net.config。似乎根本找不到文件。另外,您是否尝试过打开 log4net 的调试功能? log4net.sourceforge.net/release/1.2.0.30316/doc/manual/…
    【解决方案2】:

    过去我在使用 XmlConfigurator 属性时遇到过麻烦。也许您应该像这样在 main 中显式调用 XmlConfigurator:

    namespace NHibernate_Log4Net
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));
                var cfg = new Configuration()
                        .Configure()
                        .AddAssembly(Assembly.GetCallingAssembly());
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果为 NHibernate 记录器设置的记录级别太高(或关闭),您可能看不到来自 NHibernate 的任何日志消息。比如 ((log4net.Repository.Hierarchy.Logger)LogManager.GetLogger("NHibernate").Logger).Level的值是多少?

      您的配置文件中应该有这样的部分:

      <log4net>
              <appender name="NHLog" type="log4net.Appender.FileAppender">
                      <file value="logs/nhibernate.log" />
                      <appendToFile value="false" />
                      <layout type="log4net.Layout.PatternLayout">
                              <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
                      </layout>
              </appender>
              <logger name="NHibernate" additivity="false">
                      <level value="DEBUG"/>
                      <appender-ref ref="NHLog"/>
              </logger>
      </log4net>
      

      更新:如果日志文件总是被创建(在运行之前不存在)但总是空的,这表明在追加过程中出现异常。为了尽量减少异常的可能性,有一个非常简单的conversionPattern(也许只是"%m%n"),看看是否生成了任何输出。如果有,请添加转换模式的元素,直到找到问题所在。如果没有生成输出,请从您自己的代码中将一些内容记录到 NHibernate 记录器(这完全可以)并在调试器中逐步执行。

      ILog log = LogManager.GetLogger("NHibernate");
      
      log.Info("Application starting");
      

      如果仍然不满意,您可能需要发布一些代码/配置。

      【讨论】:

      • 我有,logs/nhibernate.log 总是生成,但保持为空。
      【解决方案4】:

      https://web.archive.org/web/20110514164829/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/07/01/how-to-configure-log4net-for-use-with-nhibernate.aspx

      我使用上面的链接来设置日志记录。试试下面的

      [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
      namespace NHibernate_Log4Net
      {
          class Program
          {
              static void Main(string[] args)
              {
                  log4net.Config.XmlConfigurator.Configure();
                  var cfg = new Configuration()
                          .AddAssembly(Assembly.GetCallingAssembly());
                          .Configure()
      
              }
          }
      }
      

      额外的是这一行

      log4net.Config.XmlConfigurator.Configure();
      

      在我添加之前它对我不起作用。我知道这有点类似于 Jeffery 的建议,但是……只是我的 2cents。

      另外,对 Nhibernate 配置对象的 Configure() 调用不应该在最后吗?程序集添加后?

      【讨论】:

      • 我可以从 log4net 获取日志,但我没有看到来自 NHibernate 的任何日志。据我所知,配置是第一位的,也就是说我们首先根据xml配置文件进行配置,然后我们寻找hbm文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多