在asp.net核心控制台应用中使用log4net登录

问题描述 投票:1回答:1

我正在尝试在asp.net核心控制台应用程序中使用log4net进行日志记录。我有一个用.net 4.7.1编写的业务库,其中包含一个日志记录包装程序,用于在所有应用程序中进行日志记录。我有一个文件附加器,一个控制台附加器,一个smtp附加器和一个ado.net附加器。所有这些都可以在我的asp.net核心Web应用程序上运行,它们也可以在我的非核心控制台应用程序上运行。

仅控制台和文件追加器可在.net核心控制台中使用。 ado.net和电子邮件附加程序似乎无效。我没有收到电子邮件,也没有任何东西插入数据库。

这是我的主要方法:

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();
}

我首先尝试使用依赖项注入使记录器进行记录,然后实例化一个新记录,然后重试。我两次都得到相同的结果。控制台和文件追加器正常工作,电子邮件和ado无效。因此,我认为这与DI无关,但可能更多是一个设置问题。我不知道该设置可能在哪里出错,因为它适用于所有其他功能,但是...

在我的业务库的AssemblyInfo.cs中,我这样设置了log4net配置:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

这是配置的样子:

  <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>

关于为什么ado和email附加程序为何不能在核心控制台应用程序中使用的任何想法?

编辑#1:我使电子邮件附加程序正常工作,但电子邮件地址设置不正确。

ado附加程序抛出此错误:

System.TypeLoadException:无法加载类型来自程序集“ mscorlib”的System.Runtime.Remoting.Messaging.CallContext,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089'。在log4net.Util.LogicalThreadContextProperties.GetLogicalProperties()在log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean创建)位于log4net.Core.LoggingEvent.CreateCompositeProperties()在log4net.Core.LoggingEvent.CacheProperties()在log4net.Core.LoggingEvent.FixVolatileData(FixFlags标志)位于log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEventloggingEvent)位于log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)

c# logging asp.net-core console-application log4net
1个回答
0
投票

尝试使用https://github.com/microknights/Log4NetAdoNetAppender,而不是标准的log4net.Appender.AdoNetAppender。您需要将配置文件中的附加器类型定义更改为:

MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender

根据其项目页面上的文档。

© www.soinside.com 2019 - 2024. All rights reserved.