Serilog в программном классе - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь войти в систему с Serilog в классе Program.cs приложения ASP.NET Core.Моя текущая настройка выглядит следующим образом:

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класс _log недоступен в Main(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?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

При создании веб-хоста IWebHost предоставляет IWebHost.Services Свойство

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.

0 голосов
/ 23 декабря 2018

попробуйте добавить Program к вашим услугам.как то так:

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