c# - 程序类中的 Serilog

标签 c# logging asp.net-core serilog

我正在尝试在 ASP.NET Core 应用程序的 Program.cs 类中使用 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 类:

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 类中复制此内容时,在 Main(string[] args) 中无法访问 _log:

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 类?

最佳答案

构建 Web 主机后,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;为了能够访问.GetService<T>() IServiceProvider 上的扩展方法.

关于c# - 程序类中的 Serilog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904616/

相关文章:

c# - 将 IGrouping 转换为 IQueryable

c# - 在 C# 中转换泛型类

java - Weblogic 托管服务器未正确记录错误

使用 Quartz.net 进行日志记录

c# - 将 NuGet .pdb 复制到输出目录

c# - 如何在 .NET Core 中创建动画 gif

c# - Dispatcher.Invoke() 不适用于该应用程序

c# - asp.net webapi : how to pass optional parameters?

r - 将信息打印到shiny-server日志中

c# - IDX12723 : Unable to decode the payload '[PII of type ' System. 字符串'被隐藏