开发者

Why log4net doesn't log nhibernate information

开发者 https://www.devze.com 2023-02-16 02:18 出处:网络
My Visual Studio Solution contains: [DLL] Sol.DataAccess (NHibernate sessionManager) [DLL] Sol.Core (Models and Repository)

My Visual Studio Solution contains:

  1. [DLL] Sol.DataAccess (NHibernate sessionManager)
  2. [DLL] Sol.Core (Models and Repository)
  3. [MVC] Sol.WebMvc (Controler, View)

All my application contains are (nhibernate.dll [v3.0] and log4net.dll[v1.2.10])

I have 3 configs:

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>

and 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开发者_如何学Go" />
    </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
    }

in my test controller i have:

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

In my log file - 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.

QUESTION: Why log4net doesn't log NHibernate information (info, debug ....)

Aren't the versions of these dlls compatible?


I have create an empty ASP.Net MVC3 project. and loss much time trying to fix this issue. And I find VS2010 bug. Visual Studio 2010 don't copy dll's in bin when you refer it in project.

I put log4net.dll manual in my bin folder and work fine. (Interesting thing is that Logger.Error("fake error") work fine without log4net.dll in bin folder ...)

Why log4net doesn't log nhibernate information


First off: you speak of "log4net.config", but you don't include that anywhere. The way you configure it in web.config, you should actually include a section called <log4net> inside your web.config, not as a separate file.

If you don't want it in your web.config, you can remove the log4net related sections altogether and add the following line to yur global.asax.cs:

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

Also, possibly you miss the priority setting, not entirely sure this helps, but give it a try:

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

Also, to finetune (because you'll get a lot messages), use something like this:

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

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

On nhibernate.info you'll find a full example.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号