在不同的.NET框架之间共享记录器

LP1*_*P13 5 .net c# .net-core coreclr asp.net-core-2.0

我正在创建一个可以在.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*oll 5

是的,它可以。如果您必须支持netcore 1,则

Install-Package Microsoft.Extensions.Logging -Version 1.1.2 
Run Code Online (Sandbox Code Playgroud)

会工作:

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

Install-Package Microsoft.Extensions.Logging.Abstractions -Version 1.1.2 
Run Code Online (Sandbox Code Playgroud)

您的组件只需要参考ILogger,使用该组件的应用程序就不会与使用MS扩展记录程序绑定在一起。特别是,如果您查看

Serilog.Extensions.Logging -Version 2.0.2 
Run Code Online (Sandbox Code Playgroud)

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

只要您知道如何将serilogger打包为MS.Extensions ILogger,使用您框架的应用程序就可以继续使用Serilog。将SerilogLoggerProvider在Serilog.Extensions.Logging的伎俩:

var msFrameworkLogger= new SerilogLoggerProvider(myExistingSerilog).CreateLogger("name");
Run Code Online (Sandbox Code Playgroud)