【问题标题】:.Net Core 3.1 Using Serilog with Microsoft.Extensions.Logger.Net Core 3.1 将 Serilog 与 Microsoft.Extensions.Logger 一起使用
【发布时间】:2020-06-29 21:07:19
【问题描述】:

在这个应用程序中,我已经拉入并设置了适用于异常的 Serilog,并且我想将 Microsoft 的 Logger 与 Serilog 一起使用,但我似乎无法弄清楚如何在没有此错误的情况下将其 DI 到服务中dotnet build.

我不确定 ILogger 使用 Serilog 实例缺少什么?

dotnet build 出错:

[13:56:21 FTL] Host terminated unexpectedly
System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'App.Services.MyService'.) 

依赖注入到服务中:

using Microsoft.Extensions.Logging;

public class MyService : BaseService
{
    private readonly ILogger _logger;

    public MyService(
        ILogger logger)
        : base(context, httpContext)
    {
        _logger = logger;
    }
    
    // ... Removed for brevity
}

实施

public static int Main(string[] args)
{
    CreateLogger();

    try
    {
        Log.Information("Starting web host");
        CreateHostBuilder(args)
            .Build()
            .Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        // Ensure buffered logs are written to their target sink
        Log.CloseAndFlush();
    }
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
        .UseSerilog();

private static void CreateLogger()
{
    string path = PrimeConstants.LOG_FILE_PATH;

    try
    {
        if (isDevelopment())
        {
            Directory.CreateDirectory(path);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Creating the logging directory failed: {0}", e.ToString());
    }

    var name = Assembly.GetExecutingAssembly().GetName();
    var outputTemplate = "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}";

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
        .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
        .MinimumLevel.Override("System", LogEventLevel.Warning)
        .Enrich.FromLogContext()
        .Enrich.WithMachineName()
        .Enrich.WithProperty("Assembly", $"{name.Name}")
        .Enrich.WithProperty("Version", $"{name.Version}")
        .WriteTo.Console(
            outputTemplate: outputTemplate,
            theme: AnsiConsoleTheme.Code)
        .WriteTo.Async(a => a.File(
            $@"{path}/prime.log",
            outputTemplate: outputTemplate,
            rollingInterval: RollingInterval.Day,
            shared: true))
        .WriteTo.Async(a => a.File(
            new JsonFormatter(),
            $@"{path}/prime.json",
            rollingInterval: RollingInterval.Day))
        .CreateLogger();
}

【问题讨论】:

    标签: c# asp.net-core .net-core serilog


    【解决方案1】:

    ILogger 不适用于 DI。您可以使用以下方法之一:

    1. 注入ILogger&lt;TCategoryName&gt;:

       public class MyService : BaseService
       {
           private readonly ILogger _logger;
      
           public MyService(ILogger<MyService> logger)
               : base(context, httpContext)
           {
               _logger = logger;
           }
      
           // ...
       }
      
    2. 注入ILoggerFactory并使用它的CreateLogger方法:

       public class MyService : BaseService
       {
           private readonly ILogger _logger;
      
           public MyService(ILoggerFactory loggerFactory)
               : base(context, httpContext)
           {
               _logger = loggerFactory.CreateLogger("<YOUR_CATEGORY_NAME>");
           }
      
           // ...
       }
      

    我推荐选项 #1,除非您想完全控制日志类别。请参阅docs 了解更多信息:

    该类别包含在ILogger 实例创建的每条日志消息中。

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 2022-06-25
      • 2021-05-03
      • 2022-07-06
      • 2020-07-14
      • 1970-01-01
      • 2023-04-07
      • 2017-09-03
      相关资源
      最近更新 更多