专心、专注、专业

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  18 Posts :: 2 Stories :: 32 Comments :: 2 Trackbacks

公告

2010年5月21日 #

当使用log4net+spring.net+Nhibernate组合的时候,如果发生异常,经过层层传递,以及Spring对异常的包装,如果直接使用

                LogManager.GetLogger(typeof(_Default)).Error(ex.Message, ex);

来记录异常信息的话,通常记录不了,猜测的原因(并没有深究。。。):ex有内部异常,且这个异常经过了nhibernate和spring包装之后,log4net无法从内部堆栈中找出最原始的异常,所以导致log4net记录不了这个异常,那么我们就采用以下形式记录:

                LogManager.GetLogger(typeof(_Default)).Error(ex.Message, ex.InnerException == null ? ex : ex.InnerException);

就能解决这个问题!

posted @ 2010-05-21 23:47 探索人生 阅读(224) 评论(0) 编辑

  通常,如果nhibernate和log4net同时出现的话,nhibernate通常会自动用log4net输出信息,这样的话,会和通过应用程序输出的日志混杂在一起。因为nhibernate会默认使用root下的appender。但是,我们可以通过配置其它的logger来控制nihibernate的输出,如下配置:(这个配置是log4net连接到sql2008的一个配置文件)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
 
  <appSettings/>
  <connectionStrings/>
  <system.web>

  </system.web>

  <log4net>

    <root>
      <level value="ALL" />
      <appender-ref ref="ADONetAppender" />
    </root>
   
    <!--Nhibernate的日志配置开始-->
   
<!--additivity是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承父Logger的appender,
    也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,
    而不会在父Logger的appender里输出。 -->
    <logger name="NHibernate" additivity="false">
      <level value="WARN" />
      <appender-ref ref="ADONetAppender" />
    </logger>
    <logger name="NHibernate.SQL" additivity="false">
      <level value="ERROR" />
      <appender-ref ref="ADONetAppender" />
    </logger>
    <!--Nhibernate的日志配置结束-->

    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="0" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="server=localhost;database=SummerData;user id=sa;password=P@ssw0rd;Connect Timeout=15;" />
      <commandText value="INSERT INTO LogMessage ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <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="@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>

  </log4net>
</configuration>

 

posted @ 2010-05-21 13:36 探索人生 阅读(183) 评论(0) 编辑