2008-09-24 4 views
9

Я использую ADONetAppender для (пытаюсь) регистрировать данные через хранимую процедуру (чтобы я мог вводить логику в процедуру ведения журнала).Как использовать хранимую процедуру в log4net ADONetAppender?

Мои настройки конфигурации перечислены ниже. Кто-нибудь может сказать, что я делаю неправильно?

<appender name="ADONetAppender_SqlServer" type="log4net.Appender.ADONetAppender"> 
    <bufferSize value="1" /> 
    <threshold value="ALL"/> 
    <param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    <param name="ConnectionString" value="<MyConnectionString>" /> 
    <param name="UseTransactions" value="False" /> 
    <commandText value="dbo.LogDetail_via_Log4Net" /> 
    <commandType value="StoredProcedure" /> 
     <parameter> 
     <parameterName value="@AppLogID"/> 
     <dbType value="String"/> 
     <size value="50" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%property{LoggingSessionId}" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@CreateUser"/> 
     <dbType value="String"/> 
     <size value="50" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%property{HttpUser}" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@Message"/> 
     <dbType value="String"/> 
     <size value="8000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%message" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@LogLevel"/> 
     <dbType value="String"/> 
     <size value="50"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%level" /> 
     </layout> 
     </parameter> 
</appender> 

ответ

4

Благодаря бдительности DBA мы решили проблему.

Обратите внимание на размер параметра «@Message». log4net угадывает, как преобразовать тип и (я думаю) преобразовать его в nvarchar, хотя столбец является varchar. Это большое дело, потому что NVARCHAR имеет максимальный размер 4000 в то время как VARCHAR имеет размер макс 8000.

АБД видел ошибки, как описано в этой статье базы знаний: http://support.microsoft.com/kb/827366

я изменил размер до 4000 и все работает плавно.

Надеюсь, это поможет кому-то еще избежать такой же проблемы.

Cheers!

-3

</configSections> 
<log4net> 

    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 

     <bufferSize value="1"/> 

     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 

     <connectionString value="Data Source=yourservername;initial Catalog=Databasename;User ID=sa;Password=xyz;"/> 



     <commandText value="INSERT INTO Log4Net ([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 ip=%property{ip}"/> 

      </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>