繁体   English   中英

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

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

我正在尝试在 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 appender 在核心控制台应用程序中可能不起作用的任何想法?

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

ado appender 抛出这个错误:

System.TypeLoadException: 无法从程序集 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 加载类型 System.Runtime.Remoting.Messaging.CallContext。
在 log4net.Util.LogicalThreadContextProperties.GetLogicalProperties() 在 log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean create) 在 log4net.Core.LoggingEvent.CreateCompositeProperties()
在 log4net.Core.LoggingEvent.CacheProperties() 在 log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags) 在 log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent) 在 log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)

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

MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender

根据他们项目页面上的文档。

暂无
暂无

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

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