在不同的 .NET 框架之间共享记录器
Sharing logger between different .NET frameworks
我正在创建一个可以在 .Net Core 1.2、.Net Core 2.0 和 .NET Framework 4.6+ 之间共享的应用程序框架。所以我选择我项目的目标框架作为.NET Standard。在我的框架项目中,我有工厂 class 用于发送短信或电子邮件。在应用程序启动时,每个应用程序将工厂与支持的服务配置为带有 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
吗?
可以。如果非要支持netcore 1,那就
Install-Package Microsoft.Extensions.Logging -Version 1.1.2
会起作用:
- https://www.nuget.org/packages/Microsoft.Extensions.Logging/1.1.2
告诉它需要 netstandard1.1
- https://github.com/dotnet/standard/blob/master/docs/versions.md告诉你
您所有的三个目标平台都实现了 netstandard1.1
但更好的是您的可重用组件只需要依赖 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 Core 1.2、.Net Core 2.0 和 .NET Framework 4.6+ 之间共享的应用程序框架。所以我选择我项目的目标框架作为.NET Standard。在我的框架项目中,我有工厂 class 用于发送短信或电子邮件。在应用程序启动时,每个应用程序将工厂与支持的服务配置为带有 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
吗?
可以。如果非要支持netcore 1,那就
Install-Package Microsoft.Extensions.Logging -Version 1.1.2
会起作用:
- https://www.nuget.org/packages/Microsoft.Extensions.Logging/1.1.2 告诉它需要 netstandard1.1
- https://github.com/dotnet/standard/blob/master/docs/versions.md告诉你 您所有的三个目标平台都实现了 netstandard1.1
但更好的是您的可重用组件只需要依赖 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");