如何在 DI 控制台应用程序中将 Serilog 记录器作为 Microsoft 记录器获取?

问题描述 投票:0回答:1

我需要在控制台应用程序中获取 Serilog 作为记录器,然后将其传递给类。我知道如何在 ASP.NET Core 中执行此操作,但我不知道如何在控制台应用程序中执行此操作。

var loggerService = host.Services.GetService<ILogger>()
返回 null。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MyProgram.Services;
using Serilog;

var hostBuilder = Host.CreateApplicationBuilder(args);
hostBuilder.Configuration
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .Build();

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(hostBuilder.Configuration)
    .Enrich.FromLogContext()
    .CreateLogger();

hostBuilder.Logging.ClearProviders();
hostBuilder.Logging.AddSerilog(logger);
hostBuilder.Services.BuildServiceProvider();
var host = hostBuilder.Build();

var configService = host.Services.GetService<IConfiguration>();
var loggerService = host.Services.GetService<ILogger>(); // null

IMyService myService = new MyService(configService, loggerService);

班级代码:

public class MyService : IMyService
{
    private readonly IConfiguration _config;
    private readonly ILogger _logger;

    public MyService(IConfiguration config, ILogger logger)
    {
        _config = config;
        _logger = logger;
    }

    private void DoSomething()
    {
        _logger.LogError("Exceprion.");
    }
}
c# .net-core serilog
1个回答
0
投票

你们非常接近。你需要这样注入它 var logger = host.Services.GetService();.

我已经修改了您的代码并以正确的方式添加了它。尝试一下吧。

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using MyProgram.Services;
    using Serilog;
    
    var hostBuilder = Host.CreateApplicationBuilder(args);
    hostBuilder.Configuration
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .Build();
    
    var logger = new LoggerConfiguration()
        .ReadFrom.Configuration(hostBuilder.Configuration)
        .Enrich.FromLogContext()
        .CreateLogger();
    
    hostBuilder.Logging.ClearProviders();
    hostBuilder.Logging.AddSerilog(logger);
    hostBuilder.Services.BuildServiceProvider();
    var host = hostBuilder.Build();
    
    var configService = host.Services.GetService<IConfiguration>();
    var loggerService = host.Services.GetService<ILogger<Program>(); // changed here
    
    IMyService myService = new MyService(configService, loggerService);

myService.DoSomthing();

这将打印如下消息。

© www.soinside.com 2019 - 2024. All rights reserved.