I'm trying to implement logging with log4net in an asp.net core console app. I have a business library written in .net 4.7.1 with a logging wrapper that I'm using to do logging in all of my apps. I have a file appender, a console appender, an smtp appender, and an ado.net appender. All of these work on my asp.net core web app and they also work in my non-core console apps.
Only the console and file appenders work in .net core console. The ado.net and email appenders do not seem to work. I don't get emails and nothing is inserted into the DB.
This is my Main method:
static void Main(string[] args)
{
// Set up DI
var serviceProvider = new ServiceCollection()
.AddSingleton<IRepository, Repository>()
.AddSingleton<ITdnLogger, TdnLogger>()
.BuildServiceProvider();
var logger = serviceProvider.GetService<ITdnLogger>();
logger.Log(LoggingLevel.Info, "This is a test log error!");
var logga = new TdnLogger();
logga.Log(LoggingLevel.Error, "Error but not an error");
Console.ReadLine();
}
I first attempt to get the logger to log using dependency injection and then I instantiate a new one and try again. I get the same results both times. Console and File appenders work, email and ado do not. So I'm thinking it has nothing to do with DI, but is probably more of a set up issue. I don't understand where the setup could be wrong, because it works for everything else, but...
In my business library's AssemblyInfo.cs I have the log4net config set up like this:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
This is what the config looks like:
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
<appender-ref ref="SmtpAppender" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline" />
</layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="ApplicationLog.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<appender name="SmtpAppender" type="Business.Logging.SimpleSmtpAppender">
<subject>**** Application Error Notification ****</subject>
<smtpHost value="{server}" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %level %logger - %message%newline%newline%exception" />
</layout>
</appender>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<threshold value="INFO" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="{valid con string}" />
<commandText value="INSERT INTO Log ([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" />
</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>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
Any ideas of why the ado and email appenders might not work in a core console app?
EDIT #1: I got the email appender to work, I had the email address setup incorrectly.
The ado appender is throwing this error:
System.TypeLoadException: Could not load type System.Runtime.Remoting.Messaging.CallContext from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
at log4net.Util.LogicalThreadContextProperties.GetLogicalProperties() at log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean create) at log4net.Core.LoggingEvent.CreateCompositeProperties()
at log4net.Core.LoggingEvent.CacheProperties() at log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags) at log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent) at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)