简体   繁体   English

在 asp.net 核心控制台应用程序中使用 log4net 进行日志记录

[英]Logging with log4net in asp.net core console app

I'm trying to implement logging with log4net in an asp.net core console app.我正在尝试在 asp.net 核心控制台应用程序中使用 log4net 实现日志记录。 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.我有一个用 .net 4.7.1 编写的业务库,带有一个日志包装器,我用它来登录我的所有应用程序。 I have a file appender, a console appender, an smtp appender, and an ado.net appender.我有一个文件附加程序、一个控制台附加程序、一个 smtp 附加程序和一个 ado.net 附加程序。 All of these work on my asp.net core web app and they also work in my non-core console apps.所有这些都适用于我的 asp.net 核心 Web 应用程序,它们也适用于我的非核心控制台应用程序。

Only the console and file appenders work in .net core console.只有控制台和文件附加程序在 .net 核心控制台中工作。 The ado.net and email appenders do not seem to work. ado.net 和电子邮件附加程序似乎不起作用。 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.控制台和文件附加程序有效,电子邮件和 ado 无效。 So I'm thinking it has nothing to do with DI, but is probably more of a set up issue.所以我认为它与 DI 无关,但可能更多是设置问题。 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:在我的业务库的 AssemblyInfo.cs 中,我的 log4net 配置设置如下:

[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?关于为什么 ado 和 email appender 在核心控制台应用程序中可能不起作用的任何想法?

EDIT #1: I got the email appender to work, I had the email address setup incorrectly.编辑 #1:我让电子邮件附加程序正常工作,但我的电子邮件地址设置不正确。

The ado appender is throwing this error: ado appender 抛出这个错误:

System.TypeLoadException: Could not load type System.Runtime.Remoting.Messaging.CallContext from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. System.TypeLoadException: 无法从程序集 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 加载类型 System.Runtime.Remoting.Messaging.CallContext。
at log4net.Util.LogicalThreadContextProperties.GetLogicalProperties() at log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean create) at log4net.Core.LoggingEvent.CreateCompositeProperties()在 log4net.Util.LogicalThreadContextProperties.GetLogicalProperties() 在 log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean create) 在 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)在 log4net.Core.LoggingEvent.CacheProperties() 在 log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags) 在 log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent) 在 log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)

Try using https://github.com/microknights/Log4NetAdoNetAppender , instead of the standard log4net.Appender.AdoNetAppender .尝试使用https://github.com/microknights/Log4NetAdoNetAppender ,而不是标准的log4net.Appender.AdoNetAppender You will need to change the appender type definition in your config file to:您需要将配置文件中的 appender 类型定义更改为:

MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender

as per the documentation on their project page.根据他们项目页面上的文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM