I'm having an issue setting up an AdoNetAppender to log my application
I'm experiencing an issue while setting up an AdoNetAppender to log my application. I'm using .NET Framework 4.7.2, Quartz 3.8.1.0, and log4net 2.0.16.0.
This is my log4net.config:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="50"/>
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionStringName value="Logs" />
<commandText value="insert into Service_Logs (Server, Service, Job, TimeStamp, Level, Logger, Message) VALUES (@server, @service, @job, @timeStamp, @level, @logger, @message)" />
<parameter>
<parameterName value="@timeStamp" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<!-- Other parameters omitted for brevity -->
</appender>
<root>
<appender-ref ref="AdoNetAppender" />
</root>
When I instantiate the configuration in my code like this:
private static void InitializeLog4Net()
{
// Setting properties for logging in DB
LogicalThreadContext.Properties["Job"] = "Main"; // To Log
LogicalThreadContext.Properties["Server"] = Environment.MachineName;
LogicalThreadContext.Properties["Service"] = Service.Default.ServiceName;
LogicalThreadContext.Properties["LogsFolder"] = Service.Default.LogsFolder;
log4net.Config.XmlConfigurator.Configure();
}
It works correctly and inserts data into the database for the Program and Service1 classes.
After this, when I start a Job from the scheduler, at the beginning, I reconfigure log4net again:
private void InitializeLog4Net(IJobExecutionContext context)
{
LogicalThreadContext.Properties["Server"] = Environment.MachineName;
LogicalThreadContext.Properties["Service"] = Service.Default.ServiceName;
LogicalThreadContext.Properties["Job"] = context.JobDetail.Key.Name;
LogicalThreadContext.Properties["LogsFolder"] = Service.Default.LogsFolder;
log4net.Config.XmlConfigurator.Configure();
}
When I use LogicalThreadContext or ThreadContext, I can't insert correctly. Instead, if I use GlobalContext, I can see the inserts correctly.
The problem I encounter with this is that using GlobalContext would set the properties globally, so when executing another job in another thread concurrently, it would conflict over who writes those configurations at what time, making them inconsistent.
This is based on the assumption that Quartz job threads work the same as any other thread; I'm not sure if they are different or not. If they are, what is wrong with my configuration, and how could I approach this to update the properties for each job without affecting others?
As a note, I have other appenders configured as well, for example:
<appender name="FileAppenderInfo" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{LogsFolder}\Info_%property{Job}_%date{yyyyMMdd}.log" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10" />
<datePattern value="yyyyMMdd'.log'" />
<maximumFileSize value="50MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} | %-5level | %-2thread | %property{Server} | %property{Service} | %property{Job} | %logger{1} | %message%newline" />
</layout>
<threshold value="Info" />
</appender>
For this one, a new file is created, for example, when the Job starts, as there is a new setting of the property: %property{Job}.
I look forward to your comments and suggestions, greetings