程序中的 Serilog class

Serilog in program class

我正在尝试在 ASP.NET 核心应用程序的 Program.cs class 中使用 Serilog 登录。我目前的设置如下:

public class Program
{
    public static void Main(string[] args)
    {
        DoStuff();
        CreateWebHostBuilder(args).Build().Run();
    }
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, builder) =>
            {
                builder.AddFile(@"C:\...\log-{Date}.txt", isJson: true);
            })
            .UseStartup<Startup>();
}

我可以通过以下操作成功登录 Controller class:

public class WebhookController : Controller
{
    readonly ILogger<WebhookController> _log;
    public WebhookController(ILogger<WebhookController> log)
    {
        _log = log;
    }
    public IActionResult Index()
    {
        _log.LogInformation("hello world");
        return View();
    }
}

但是,当尝试在 program class 中复制此内容时,_logMain(string[] args) 中无法访问:

public class Program
{
    readonly ILogger<Program> _log;
    public Program(ILogger<Program> log)
    {
        _log = log;
    }

    public static void Main(string[] args)
    {
        DoStuff();
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, builder) =>
            {
                builder.AddFile(@"C:\...\log-{Date}.txt", isJson: true);
            })
            .UseStartup<Startup>();
}

如何配置 Serilog 以登录 program class?

尝试将 Program 添加到您的服务中。 像这样:

.Configure(services => services.AddTransiant<Program>())

构建虚拟主机时,IWebHost 公开 IWebHost.Services Property

public IServiceProvider Services { get; }

可用于解析所需的依赖项。

public class Program {

    public static void Main(string[] args) {
        var webHost = CreateWebHostBuilder(args).Build();
        var services = webHost.Services;

        var log = services.GetService<ILogger<Program>>();

        DoStuff(log);

        webHost.Run();
    }

    static void DoStuff(ILogger<Program> log) {
        //...
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, builder) =>
            {
                builder.AddFile(@"C:\...\log-{Date}.txt", isJson: true);
            })
            .UseStartup<Startup>();
}

记得包含 using Microsoft.Extensions.DependencyInjection; 以便在 IServiceProvider 上访问 .GetService<T>() 扩展方法。