c# - 如何从 Serilog.ILogger 创建 MELA.ILogger 以在 .NET Standard 库中使用
问题描述
我正在将 .NET Standard 实用程序库从控制台日志记录转换为ILogger
日志记录。
该库包含静态实用程序类,我公开了一个ILogger
由用户设置的静态属性,以指向他们想要使用的任何日志记录系统。
我希望我的 .NET Core 3.1 和 .NET 5 控制台应用程序使用 Serilog 进行日志记录,并将库分配ILogger
给 Serilog,并具有 Serilog 附带的所有优点。我没有在实用程序库中使用 DI,因为它是静态方法,而不是“服务”类。
如何手动(不使用 DI)Microsoft.Extensions.Logging.ILogger
从 aSerilog.ILogger
或Serilog.Extensions.Logging.SerilogLoggerFactory
.
关于更简单的方法与示例代码的任何建议?
// How to create a "Microsoft.Extensions.Logging.ILogger" from a "Serilog.ILogger"?
Microsoft.Extensions.Logging.ILogger logger = Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance;
// https://github.com/serilog/serilog-extensions-logging/blob/dev/samples/Sample/Program.cs
LoggerProviderCollection providerCollection = new LoggerProviderCollection();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.Providers(providerCollection)
.CreateLogger();
ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(providerCollection);
serviceCollection.AddSingleton<ILoggerFactory>(sc =>
{
LoggerProviderCollection loggerProviderCollection = sc.GetService<LoggerProviderCollection>();
SerilogLoggerFactory serilogLoggerFactory = new SerilogLoggerFactory(null, true, loggerProviderCollection);
foreach (ILoggerProvider loggerProvider in sc.GetServices<ILoggerProvider>())
serilogLoggerFactory.AddProvider(loggerProvider);
return serilogLoggerFactory;
});
serviceCollection.AddLogging(logging => logging.AddConsole());
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
ILogger<Program> programLogger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger = programLogger;
logger.LogInformation("Testing testing");
解决方案
我找到了一个代码更简单的解决方案:
// https://www.nexmo.com/legacy-blog/2020/02/10/adaptive-library-logging-with-microsoft-extensions-logging-dr
// Default : "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
// Serilog logger
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Level} {SourceContext} | {Message:lj}{NewLine}{Exception}",
theme: AnsiConsoleTheme.Code)
.CreateLogger();
// MEL logger factory
LoggerFactory loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(Log.Logger);
// MEL logger
Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger("Foo");
logger.LogInformation("Testing testing");
推荐阅读
- c++ - 我无法使用 FTGL(未找到 ft2build.h)
- reactjs - 如何在 Firebase 中使用 SetState 或函数
- abstract-syntax-tree - 为什么自定义 ESLint 规则的选择器在 AST 上失败?
- php - PHP SOAP 类转换如何工作以及如何获得一致的列表结果?
- angularjs - AngularJS 中具有切换功能的垂直 SideMenu
- macos - 使用 awk 的多个分隔符并跟踪 $0 作为 var 对不同的字段进行排序
- c++ - 在 boost 进程异步子进程中 run() 之后是否需要 wait()?
- python-3.x - Pygments 中特殊的非句法突出显示
- ios - FirStorageUploadTask 的 Firebase EXC_BAD_ACCESS 错误
- c# - 我正在使用事件气泡日试点调度程序..单击事件时如何显示事件详细信息?