Почему log4net не регистрирует информацию о nhibernate - PullRequest
4 голосов
/ 11 марта 2011

My Visual Studio Solution содержит:

  1. [DLL] Sol.DataAccess (NHessionnate 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 (info, debug ....)

Разве версии этих dll не совместимы?

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

Я создал пустой проект ASP.Net MVC3.и потеря много времени, пытаясь решить эту проблему.И я нахожу ошибку VS2010. Visual Studio 2010 не копирует DLL в bin, когда вы ссылаетесь на него в проекте.

Я поместил руководство log4net.dll в папку bin и работает нормально. (Интересно, что Logger.Error («поддельная ошибка») работает нормально без log4net.dll в папке bin ...)

enter image description here

3 голосов
/ 13 марта 2011

Прежде всего: вы говорите о "log4net.config", но вы нигде не включаете его.Как вы настраиваете его в web.config, вы должны включить раздел <log4net> внутри вашего web.config, а не в отдельный файл.

Если вы не хотитев вашем файле web.config вы можете полностью удалить разделы, связанные с log4net, и добавить следующую строку в yur 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 вы найдете полный пример .

...