首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Serilog.ILogger创建在.NET标准库中使用的MELA.ILogger

如何从Serilog.ILogger创建在.NET标准库中使用的MELA.ILogger
EN

Stack Overflow用户
提问于 2021-01-22 03:42:41
回答 3查看 319关注 0票数 2

我正在将一个.NET标准实用程序库从控制台日志记录转换为ILogger日志记录。

该库由静态实用程序类组成,我公开了一个由用户设置的静态ILogger属性,以指向他们想要使用的任何日志记录系统。

我希望我的.NET Core3.1和.NET 5控制台应用程序使用Serilog进行日志记录,并将库ILogger分配给Serilog,同时具有Serilog带来的所有好处。我没有在实用程序库中使用DI,因为它是静态方法,而不是“服务”类。

如何从Serilog.ILoggerSerilog.Extensions.Logging.SerilogLoggerFactory手动(不使用DI)创建Microsoft.Extensions.Logging.ILogger

与示例代码相比,有什么建议更简单的方法吗?

代码语言:javascript
复制
// 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");
EN

回答 3

Stack Overflow用户

发布于 2021-01-22 08:29:22

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

代码语言:javascript
复制
// 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");
票数 1
EN

Stack Overflow用户

发布于 2021-02-04 01:31:18

下面的方法对我很有效。

代码语言:javascript
复制
// existing serilog logger
Serilog.ILogger logger = Log.ForContext<MyType>();

// create MEL logger from serilog logger
var loggerFactory = new Microsoft.Extensions.Logging.LoggerFactory();
loggerFactory.AddSerilog(logger);
var melLogger = loggerFactory.CreateLogger<MyType>();

// sample log message
melLogger.LogInformation("Sample log message");

相关NuGet包:

  • 系列日志-适用于serilog
  • Serilog.Extensions.Logging -适用于AddSerilog method
  • Microsoft.Extensions.Logging -适用于LogInformation
  • -适用于logging factory LogInformation

Serilog是在一个单独的项目中配置的,该项目只包含Serilog.AspNetCore NuGet包。

我需要做一个MEL记录器的原因是因为有一个第三方的库。该库只接受MEL记录器提供程序。这个解决方案没有对ILogger使用依赖注入,所以我必须进行转换。

票数 0
EN

Stack Overflow用户

发布于 2021-10-28 12:35:26

这是我能找到的最简单的方法:

代码语言:javascript
复制
Using Serilog;

然后在你的方法中。注意:下面代码片段中的melLogger是记录器的新实例

代码语言:javascript
复制
Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .WriteTo.Debug(restrictedToMinimumLevel: LogEventLevel.Verbose)
    .CreateLogger();

Microsoft.Extensions.Logging.ILogger melLogger= new SerilogLoggerProvider(Log.Logger)
                                               .CreateLogger("WHATVER_YOU_WANT");

然后通过依赖注入在整个系统中使用,秘诀是.UseSeriLog():

代码语言:javascript
复制
Host.CreateDefaultBuilder()
    .UseSerilog()                
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup(typeof(StartUp));
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65834675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档