Log4NetAdoNetAppender icon indicating copy to clipboard operation
Log4NetAdoNetAppender copied to clipboard

Duplicate Entry for same Request

Open Srusti-Thakkar opened this issue 4 years ago • 6 comments

I had used this nuget in .net core 3.1 version. I am facing issue of duplicate entries for same request. Sometimes it's two, three, four and more than that. My configuration of log4net is :


<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
  <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
    <threshold value="Error" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="WebLog" type="log4net.Appender.RollingFileAppender">
    <threshold value="Error" />
    <file type="log4net.Util.PatternString" value="\Log\logs_" />
    <staticLogFileName value="false" />
    <param name="AppendToFile" value="true" />
    <param name="RollingStyle" value="Date" />
    <param name="DatePattern" value="yyyy-MM-dd'.log'" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date  %-5level %logger  - %message%newline" />
    </layout>
  </appender>

  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <threshold value="INFO" />
    <bufferSize value="1" />
    <connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5" />
    <connectionStringName value="DefaultConnection" />
    <connectionStringFile value="appsettings.Development.json" />
    <commandText value="EXEC sp_InsertLogInTable @TableName, @RequestTime, @Url, @TimeElapsed, @StatusCode, @Headers, @Referer,@IP,@Method,@PostData,@QueryString, @UserId,@UserAgent, @LogLevel" />
    <parameter>
      <parameterName value="@TableName" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{TableName}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@RequestTime" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{RequestTime}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Url" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Url}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@TimeElapsed" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{TimeElapsed}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@StatusCode" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{StatusCode}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Headers" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Headers}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Referer" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Referer}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@IP" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{IP}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Method" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Method}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@PostData" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{PostData}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@QueryString" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{QueryString}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@UserId" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{UserId}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@UserAgent" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{UserAgent}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@LogLevel" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
  </appender>

  <root>
    <level/>
    <appender-ref ref="DebugAppender" />
    <appender-ref ref="WebLog" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

Srusti-Thakkar avatar Dec 01 '20 04:12 Srusti-Thakkar

Is it only the AdoNetAppender that get multiple entries of the same log?

microknights avatar Dec 01 '20 09:12 microknights

Yes

Srusti-Thakkar avatar Dec 01 '20 09:12 Srusti-Thakkar

Yes

Try out with

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
  <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
    <threshold value="Error" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="WebLog" type="log4net.Appender.RollingFileAppender">
    <threshold value="Error" />
    <file type="log4net.Util.PatternString" value="\Log\logs_" />
    <staticLogFileName value="false" />
    <param name="AppendToFile" value="true" />
    <param name="RollingStyle" value="Date" />
    <param name="DatePattern" value="yyyy-MM-dd'.log'" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date  %-5level %logger  - %message%newline" />
    </layout>
  </appender>

  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <reconnectOnError value="true" />
	<useTransactions value="false" />
    <bufferSize value="1" />
    <connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5" />
    <connectionStringName value="DefaultConnection" />
    <connectionStringFile value="appsettings.Development.json" />
    <commandText value="EXEC sp_InsertLogInTable @TableName, @RequestTime, @Url, @TimeElapsed, @StatusCode, @Headers, @Referer,@IP,@Method,@PostData,@QueryString, @UserId,@UserAgent, @LogLevel" />
    <parameter>
      <parameterName value="@TableName" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{TableName}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@RequestTime" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{RequestTime}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Url" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Url}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@TimeElapsed" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{TimeElapsed}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@StatusCode" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{StatusCode}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Headers" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Headers}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Referer" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Referer}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@IP" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{IP}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@Method" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Method}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@PostData" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{PostData}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@QueryString" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{QueryString}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@UserId" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{UserId}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@UserAgent" />
      <dbType value="String" />
      <size value="10000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{UserAgent}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@LogLevel" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
	<filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
      <levelMin value="INFO" />
      <levelMax value="FATAL" />
    </filter>  
  </appender>

  <root>
    <level/>
    <appender-ref ref="DebugAppender" />
    <appender-ref ref="WebLog" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

KamranShahid avatar Jul 08 '21 05:07 KamranShahid

micronight.zip

You can also use my implementation locally and debug why you are getting duplicate entries

KamranShahid avatar Jul 08 '21 05:07 KamranShahid

Without doing any debugging, my best guess is that your custom impl. ChunkWiseInsertion is the criminal, there is multiple foreach loops.

I am pretty sure Log4NetAdoNetAppender works the way it should, and only logs 1 entry a single time.

microknights avatar Jul 08 '21 08:07 microknights

Without doing any debugging, my best guess is that your custom impl. ChunkWiseInsertion is the criminal, there is multiple foreach loops.

I am pretty sure Log4NetAdoNetAppender works the way it should, and only logs 1 entry a single time.

I am not getting that error micronights. chunkwise insertion related thing can be ignored . i am just suggesting him to local copy your implementation and debug for the reason. i myself never experience it in such way. using implementation of your since more then two year in .net core 2.1 then .net core 3.1 solutions with mysql db at backend

KamranShahid avatar Jul 08 '21 09:07 KamranShahid