ASP.NET Core 2+中的ILogger和DependencyInjection

pom*_*roy 7 c# logging dependency-injection .net-core asp.net-core

我注意到没有明确的ILogger登记ConfigureServicesStartup.cs.

第一个问题:如何ILogger注入例如控制器.

第二个问题:如何配置ILogger注入中间件?

Nko*_*osi 10

日志记录是HostBuilder.Build过程的一部分

private void CreateServiceProvider()
{
    var services = new ServiceCollection();
    services.AddSingleton(_hostingEnvironment);
    services.AddSingleton(_hostBuilderContext);
    services.AddSingleton(_appConfiguration);
    services.AddSingleton<IApplicationLifetime, ApplicationLifetime>();
    services.AddSingleton<IHostLifetime, ConsoleLifetime>();
    services.AddSingleton<IHost, Host>();
    services.AddOptions();
    services.AddLogging();//<--HERE

    //...
Run Code Online (Sandbox Code Playgroud)

WebHostBuilder.BuildCommonServices

    private IServiceCollection BuildCommonServices(out AggregateException hostingStartupErrors)
    {

        //... code removed for brevity

        var services = new ServiceCollection();
        services.AddSingleton(_options);
        services.AddSingleton<IHostingEnvironment>(_hostingEnvironment);
        services.AddSingleton<Extensions.Hosting.IHostingEnvironment>(_hostingEnvironment);
        services.AddSingleton(_context);

        var builder = new ConfigurationBuilder()
            .SetBasePath(_hostingEnvironment.ContentRootPath)
            .AddConfiguration(_config);

        _configureAppConfigurationBuilder?.Invoke(_context, builder);

        var configuration = builder.Build();
        services.AddSingleton<IConfiguration>(configuration);
        _context.Configuration = configuration;

        var listener = new DiagnosticListener("Microsoft.AspNetCore");
        services.AddSingleton<DiagnosticListener>(listener);
        services.AddSingleton<DiagnosticSource>(listener);

        services.AddTransient<IApplicationBuilderFactory, ApplicationBuilderFactory>();
        services.AddTransient<IHttpContextFactory, HttpContextFactory>();
        services.AddScoped<IMiddlewareFactory, MiddlewareFactory>();
        services.AddOptions();
        services.AddLogging();
Run Code Online (Sandbox Code Playgroud)

ILogger注入控制器,只需将其作为依赖项包含在构造函数中

private readonly ILogger logger;

public MyController(ILogger<MyController> logger) {
    this.logger = logger;
}

//...
Run Code Online (Sandbox Code Playgroud)

并且框架将在激活时将其注入控制器.

参考依赖注入ASP.NET Core中的控制器

与控制器一样,Middleware vai构造函数注入也可以这样做,

或者直接进入每个请求依赖Invoke方法

public Task Invoke(HttpContext context, ILogger<MyMiddleware> logger) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

像任何其他注入的服务

参考ASP.NET核心中间件