Log4NetAdoNetAppender
Log4NetAdoNetAppender copied to clipboard
Duplicate Entry for same Request
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>
Is it only the AdoNetAppender
that get multiple entries of the same log?
Yes
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>
You can also use my implementation locally and debug why you are getting duplicate entries
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.
Without doing any debugging, my best guess is that your custom impl.
ChunkWiseInsertion
is the criminal, there is multipleforeach
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