【问题标题】:Sharing logger between different .NET frameworks在不同的 .NET 框架之间共享记录器
【发布时间】:2018-03-21 16:17:50
【问题描述】:

我正在创建一个可以在 .Net Core 1.2、.Net Core 2.0 和 .NET Framework 4.6+ 之间共享的应用程序框架。所以我选择我项目的目标框架为 .NET Standard。在我的框架项目中,我有用于发送文本消息或电子邮件的工厂类。在应用程序启动时,每个应用程序将具有支持服务的工厂配置为具有 DI 框架的单例实例。

public class MyFactory : IMyFactory
{
      private ILogger _logger;
      private IDictionary<string,IMyService> _container = new Dictionary<string,IMyService>();

    // this method is called on application startup to configure supported services
    public void Configure(string[] keys, ILogger logger)
    {  
        foreach(var key in keys)
        {
             if(key == "text")
             {
                 container.Add(key,new TextMessageService());
             }   

             if(key == "email")
             {
                 container.Add(key,new EmailService());
             }
        }
    }

    //application call this method to send message
    public bool SendMessage(string key, string message)
    {
         // we don't want application to stop when publish fail, so we add try-catch and log the message
         var flag = false;

         try
         {
             var service= container[key];
             service.Publish(message);
             flag = true;
         }
         class(Exception ex)
         {
            _logger.Error(ex);
         }

         return flag;
    }
}

问题:发布方法可能因任何原因而失败。在这种情况下,我不希望应用程序停止,而是框架应该记录错误消息。我的问题是由于框架可以在不同的 .NET 框架之间共享,我不知道应该使用哪种类型的 ILooger 可以在 .NET Core 和 .NET Full 之间共享。

我试图避免创建自己的ILogger 接口。目前所有应用程序都在使用Serilog,但将来可能会改变。

这里可以使用Microsoft.Extensions.Logging吗?

【问题讨论】:

  • 您是否尝试过使用Microsoft.Extensions.Logging
  • 嗯? ILogger 不是某种语言功能。有各种日志框架和门面暴露了ILogger 接口。您只需要 that 库可供所有三个目标使用。实际上,几乎所有的日志框架都应该如此。

标签: c# .net .net-core asp.net-core-2.0 coreclr


【解决方案1】:

是的,它可以。如果你必须支持netcore 1,那么

Install-Package Microsoft.Extensions.Logging -Version 1.1.2 

会起作用的:

但更好的是您的可重用组件只需要依赖Abstractions

Install-Package Microsoft.Extensions.Logging.Abstractions -Version 1.1.2 

您的组件只需要引用ILogger,使用您的组件的应用程序与使用 MS 扩展记录器无关。特别是,如果您查看

Serilog.Extensions.Logging -Version 2.0.2 

https://www.nuget.org/packages/Serilog.Extensions.Logging/ ,您可以看到它依赖于 Abstractions 但不依赖于 MS Extensions 记录器。 Serilog 确实依赖于 netstandard1.3。但是 netstandard 版本页面再次告诉您所有目标都支持它。

使用您的框架的应用程序可以继续使用 Serilog,只要他们知道如何将 serilogger 包装为 MS.Extensions ILogger。 Serilog.Extensions.Logging 中的 SerilogLoggerProvider 可以解决问题:

var msFrameworkLogger= new SerilogLoggerProvider(myExistingSerilog).CreateLogger("name");

【讨论】:

  • 谢谢..这是我需要的..我不确定我是否在 NET Standard Framework 项目中使用 Microsoft.Extensions.Logging.ILogger 并且应用程序正在使用 Serilog 类型将如何匹配
  • 因此,任何使用 Serilog 的应用程序都希望将依赖项添加到处理 "adapt-Serilog-to-MS.ILogger" 的 Serilog.Extensions 包;但这应该是可以接受的。在您的共享组件中,您只能访问基本的 ILogger 界面——但这就是组件想要的全部。
  • 那我怎么adapt-Serilog-to-MS.ILogger。我是否在应用程序中显式调用任何将创建Microsoft.Extensions.Logging.ILogger 实例的方法?目前我收到错误InvalidOperationException - The current type, Microsoft.Extensions.Logging.ILogger1[XXXX.Common.FW.MyFactory],是一个接口,无法构造。您是否缺少类型映射?`
  • 简单的事情,对于使用 Serilog 的应用程序,添加 Serilog.Extensions.Logging nuget 包,然后添加 var msFrameworkLogger= new SerilogLoggerProvider(theExistingSerilogger).CreateLogger(); 也有 var msframeworklogger= new LoggerFactory().AddSerilog().CreateLogger(); 做同样的事情。 github.com/chrisfcarroll/DotNetCoreTemplates/blob/master/…的SetUp方法中有一个例子
  • 我已经配置了serilog。 Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration).CreateLogger(); 并且它一直在工作。这是否还会配置Microsoft.Extensions.Logging.ILogger 的实例以使DI 工作?注意MyFactory 类的构造函数采用Microsoft.Extensions.Logging.ILogger
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2010-12-13
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多