1

Trying to use log4net AdoNetAppender with the example/default configuration I'm getting a weird parameter error

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
System.IndexOutOfRangeException: An SqlParameter with ParameterName '@log_date' is not contained by this SqlParameterCollection.

I don't see anything wrong with the parameter declaration

<parameter>
    <parameterName value="@log_date"/>
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>

But still, trying to remove the parameter it's simply the next one that fails in the same fashion, I've tried to change the connection string, thinking there might be an underlying error I'm not seeing, not luck either.

The log4net debug log even clearly state

 log4net: Setting Collection Property [AddParameter] to object [log4net.Appender.AdoNetAppenderParameter] 

for every parameters, so I really don't know what's going on

Bellow is the complete config I've for log4net

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="DBAppender" />
    <appender-ref ref="RollingFileAppender" />
    <appender-ref ref="DebugAppender" />
  </root>

  <appender name="DBAppender" type="log4net.Appender.AdoNetAppender">
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    <connectionStringName value="CustomerDB" />
    <bufferSize value="1" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
    <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>
  </appender>

  <appender name="DebugAppender" type="log4net.Appender.DebugAppender">
    <immediateFlush value="true" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
</log4net>
Simon Rapilly
  • 393
  • 1
  • 13
  • 1
    What version - see https://stackoverflow.com/questions/33696604/log4net-adonetappender-sqlparametercollection-does-not-contain-parameters#33732495 – sgmoore Nov 23 '17 at 15:44
  • 2.0.4, next thing I was going to try was an update, unfortunately one of NuGet's download address is currently being blocked at the office so I'll have to try later – Simon Rapilly Nov 23 '17 at 15:51

1 Answers1

2

You need to update to log4net 2.0.5, 2.0.4 AdoNetAppenderis broken.

Peter
  • 27,590
  • 8
  • 64
  • 84