2008-09-24 6 views
9

J'utilise ADONetAppender pour essayer de consigner des données via une procédure stockée (afin de pouvoir injecter de la logique dans la routine de consignation).Comment utiliser une procédure stockée dans log4net ADONetAppender?

Mes paramètres de configuration sont répertoriés ci-dessous. Quelqu'un peut-il dire ce que je fais mal?

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

Répondre

4

Grâce à un DBA vigilant, nous avons résolu le problème.

Notez la taille du paramètre "@Message". log4net est en train de deviner comment convertir le type et (je pense) le convertir en nvarchar même si la colonne est un varchar. Ceci est un gros problème parce que nvarchar a une taille maximum de 4000 tandis que varchar a une taille maximale de 8000.

Le DBA a vu des erreurs comme décrit dans cet article KB: http://support.microsoft.com/kb/827366

J'ai changé la taille à 4000 et tout travaille nager.

Espérons que cela aidera quelqu'un d'autre à éviter le même problème.

À la votre!

-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> 
Questions connexes