首页 > 解决方案 > 如何从 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.ILoggerSerilog.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");

标签: c#serilog

解决方案


我找到了一个代码更简单的解决方案:

// 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");


推荐阅读