首页 > 解决方案 > Net Core 3.0 和 Serilog 产生像 Microsoft.Extensions.Logging 这样的输出

问题描述

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

在我的主机生成器中,我这样做:

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 的输出就像我使用默认记录一样。但据我了解,主机生成器现在已替换 ILoggerFactory 并且应该输出 Serilog 样式的输出。

这是我的两个输出,首先来自静态,然后来自 _logger

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

标签: c#loggingdependency-injection.net-coreserilog

解决方案


我遇到的问题是,每当我捕获队列事件时,日志都会使用 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>();
                });

推荐阅读