【问题标题】:Why log4net doesn't log nhibernate information为什么 log4net 不记录休眠信息
【发布时间】:2011-07-13 15:32:41
【问题描述】:

我的 Visual Studio 解决方案包含:

  1. [DLL] Sol.DataAccess (NHibernate sessionManager)
  2. [DLL] Sol.Core(模型和存储库)
  3. [MVC] Sol.WebMvc(控制器,视图)

我的应用程序包含的所有内容都是(nhibernate.dll [v3.0] 和 log4net.dll[v1.2.10])

我有 3 个配置:

web.config:

<configuration>
    <configSections>
         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" requirePermission="false" />
         <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
    </configSections>
</configuration>

nhibernate.config:

<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="...">
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string_name">...</property>
    <property name="adonet.batch_size">10</property>
    <property name="show_sql">true</property>
    <property name="generate_statistics">true</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="use_outer_join">true</property>
    <property name="max_fetch_depth">2</property>
    <property name="command_timeout">60</property>
    <property name="adonet.batch_size">25</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <property name="current_session_context_class">web</property>
    <property name="cache.use_query_cache">true</property>
    <property name="cache.provider_class">NHibernate.Caches.SysCache2.SysCacheProvider, NHibernate.Caches.SysCache2</property>
    <mapping assembly="..."/>
  </session-factory>
</hibernate-configuration>

和 log4net.config:

<log4net>
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <!--for release-->
    <!--<bufferSize value="10" />-->
    <!--for debug-->
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="Data Source=xxxxx; Initial Catalog=xxxx; User Id=xxxx; Password=xxxxx; App=xxxx" />
    <commandText value="INSERT INTO Logs ([Application],[Host],[User],[Date],[Thread],[Level],[Operation],[Logger],[Message],[Exception]) VALUES (@app, @hostName, @userName, @log_date, @thread, @log_level, @operation, @logger, @message, @exception)" />
    <parameter>
      <parameterName value="@app" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="xxxx" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@hostName" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{hostName}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@userName" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{userName}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@operation" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Operation}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>

  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="Logs/Logs.txt"/>
    <appendToFile value="true"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
    </layout>
  </appender> 

  <appender name="Console" type="log4net.Appender.AspNetTraceAppender">
    <!--A1 uses PatternLayout-->
    <layout type="log4net.Layout.PatternLayout">
      <!--Print the date in ISO 8601 format-->
      <conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline"/>
    </layout>
  </appender>

  <root>
    <level value="ALL"/>
    <appender-ref ref="Console"/>
    <appender-ref ref="FileAppender"/>
    <appender-ref ref="AdoNetAppender"/>
  </root>
</log4net>

Global.cs:

protected void Application_Start()
    {
       ...
        // Configuration

        #region log4net
        // log4net.config
        System.IO.FileInfo fi = new System.IO.FileInfo(Server.MapPath("~/log4net.config"));
        if (fi != null && fi.Exists)
        {
            // Code that runs on application startup
            log4net.Config.XmlConfigurator.Configure(fi);
        }

        // web.config
        //log4net.Config.XmlConfigurator.Configure();

        // set properti hostName
        log4net.GlobalContext.Properties["hostName"] = Dns.GetHostName();
        #endregion

        #region NHibernate
        //HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
        var factory = NHibernateSessionManager.ConfigureFromFile(Server.MapPath("~/hibernate.config"));
        #endregion
    }

在我的测试控制器中,我有:

public class TestController : BaseController
    {
        [NHibernateSession]
        public ActionResult Index()
        {
             Logger.Error("fake error", new Exception());
        }
     }

在我的日志文件中 - Logs/Logs.txt:

2011-03-11 18:19:23,097 [8] ERROR System.Web.Mvc.Controller [(null)] - fake error
System.Exception: Exception of type 'System.Exception' was thrown.

问题: 为什么 log4net 不记录 NHibernate 信息(信息、调试 ....)

这些 dll 的版本不兼容吗?

【问题讨论】:

  • 在 TestController 中我尝试使用 nhibernate 会话进行选择和保存 ...
  • 您可能不想在公共论坛上发布您的密码,是吗?
  • 我尝试在新的 webForms 项目中使用相同的 web.config、log4net.config、nhibernate.config 来自相同的解决方案。它工作。我该如何为 MVC 工作?
  • 这类似于我使用 Log4Net 的经验。配置不好太容易了,而且不知道为什么会失败。

标签: asp.net-mvc nhibernate logging web-config log4net


【解决方案1】:

首先:你说的是“log4net.config”,但你没有在任何地方包含它。在web.config 中配置它的方式,实际上应该在您的web.config 中包含一个名为&lt;log4net&gt; 的部分,而不是作为单独的文件。

如果您不想在 web.config 中使用它,您可以完全删除 log4net 相关部分并将以下行添加到您的 global.asax.cs:

log4net.Config.XmlConfigurator.ConfigureAndWatch(
      New FileInfo(Server.MapPath("~/yourreleativepath/log4net.config")))

另外,您可能错过了优先级设置,不完全确定这是否有帮助,但请尝试一下:

<root>
  <priority value="DEBUG"/>
  <appender-ref ref="Console"/>
  <appender-ref ref="FileAppender"/>
  <appender-ref ref="AdoNetAppender"/>
</root>

此外,要进行微调(因为您会收到 很多 消息),请使用以下内容:

<logger name="NHibernate.SQL">
    <level value="DEBUG"/>
</logger>

<logger name="NHibernate">
    <level value="WARN"/>
</logger>

您将在 nhibernate.info 上find a full example

【讨论】:

  • 1.在我的 Global.asax.cs 我有: // log4net.config System.IO.FileInfo fi = new System.IO.FileInfo(Server.MapPath("~/log4net.config")); if (fi != null && fi.Exists) { // 在应用程序启动时运行的代码 log4net.Config.XmlConfigurator.Configure(fi); } 2. --- 我试过了 -> 不工作。 3.“微调”->谢谢我知道这件事……但我想先得到信息。
  • @Artiom:使用断点检查 log4net 是否确实加载正确。如果这没有帮助,请启用 Log4net 日志记录本身,请参阅here under "How do I enable log4net internal debugging?"。最后,您可能仍想尝试设置&lt;logger name="NHibernate"&gt;。没有它应该可以工作,但是,嘿,为什么不试试呢?
【解决方案2】:

我创建了一个空的 ASP.Net MVC3 项目。并浪费很多时间尝试解决此问题。 我发现 VS2010 错误。 在项目中引用时,Visual Studio 2010 不会将 dll 复制到 bin 中。

我将 log4net.dll 手册放在我的 bin 文件夹中并且工作正常。 (有趣的是 Logger.Error("fake error") 在 bin 文件夹中没有 log4net.dll 时可以正常工作...)

【讨论】:

  • 这取决于您如何设置项目,是否正在复制和/或刷新程序集。不过,您应该已经在 global.asax.cs 中看到了一个错误,因为您无法调用未引用程序集的方法,因此您在其中放置了配置行。如果您只在 web.config 中配置它,这是正常行为:编译器无法知道它应该复制程序集(这就是为什么我经常在某处添加 log4net 语句来强制它)。但是:很高兴你解决了!
猜你喜欢
  • 2012-01-27
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多