Net Core 3.0和Serilog产生类似于Microsoft.Extensions.Logging的输出

时间:2019-10-25 15:29:49

标签: c# logging dependency-injection .net-core serilog

我有一个使用.Net Core 3.0的简单Web应用程序。

在主机构建器中,我这样做:

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                    .ReadFrom.Configuration(hostingContext.Configuration)
                    .Enrich.FromLogContext()
                    .WriteTo.Console());

然后我尝试在Web应用程序项目引用的另一个项目(使用netcoreapp3.0的简单dll)中实现它:

using using Microsoft.Extensions.Logging;
...
private readonly ILogger<MyClass> _logger;

public MyClass(ILogger<MyClass> logger){
  _logger = logger;
  ...
  Log.Logger.Information("this is a test {test}", command.GetType().Name);

  _logger.LogInformation("Command received: {CommandType}", command.GetType().Name);
}
...

静态记录器可以正常工作,但_logger的输出就像我使用默认记录器一样。但是据我阅读this的了解,主机构建器现在已替换了ILoggerFactory,并应输出Serilog样式的输出。

These are my two outputs, first from the static and then from _logger

如何使_logger输出与Serilog一样整洁?

1 个答案:

答案 0 :(得分:0)

我遇到的问题是,每当我捕获队列事件时,日志便使用Microsoft.Extensions.Logging样式的日志记录。

这似乎是因为事件监听器在替换日志记录工厂之前以某种方式已注册,但是在之后执行,这导致了奇怪的日志记录。我的解决方案是这样做的:

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                    .ReadFrom.Configuration(hostingContext.Configuration)
                    .Enrich.FromLogContext()
                    .WriteTo.Console());
                    webBuilder.UseStartup<Startup>();
                });