C# HostBuilder 日志记录配置。非通用记录器为空

标签 c# logging .net-core

我有一个安装了以下软件包的 dotnet core 3.0 控制台应用程序:

<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.0.1" />

这是我的整个最小的、可复制的完整程序:

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace logging
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new HostBuilder()
                .ConfigureLogging((context, b) =>
                {
                    b.AddConsole();
                })
                .Build();

            var logger = host.Services.GetService<ILogger>();
            var genericLogger = host.Services.GetService<ILogger<Program>>();
        }
    }
}

当我尝试解析这两个记录器时,通用的记录器可以正常解析,但非通用的记录器始终为空。谁能发现为什么我的非通用记录器为空?

最佳答案

是因为ILogger具体没有添加到服务集合中。只有通用

/// <summary>
/// Adds logging services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">The <see cref="ILoggingBuilder"/> configuration delegate.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddLogging(this IServiceCollection services, Action<ILoggingBuilder> configure)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddOptions();

    services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
    services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));

    services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<LoggerFilterOptions>>(
        new DefaultLoggerLevelConfigureOptions(LogLevel.Information)));

    configure(new LoggingBuilder(services));
    return services;
}

Source

为了证明这一点,如果要使用您的示例调用以下内容

var logger = host.Services.GetRequiredService<ILogger>();

它会抛出无法解析请求类型的异常。

ILogger 通常不用于显式注入(inject)或解析,而是作为赋值的基类型

例如

public class AboutModel : PageModel {
    private readonly ILogger logger;

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

    //...
}

或者在非主机控制台应用程序中

var loggerFactory = LoggerFactory.Create(builder => {
    builder.AddConsole();
});

ILogger logger = loggerFactory.CreateLogger<Program>();

引用 Logging in .NET Core and ASP.NET Core

关于C# HostBuilder 日志记录配置。非通用记录器为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58975564/

相关文章:

c# - HTTP 摘要认证 - 在多个 http 请求之间共享 MD5 实例

android - 亚行 logcat Cordova 安卓 4

c# - 如何在 dot net core 中查找 mx 记录?

c# - Q : How to serialized parallel connection with FIFO Queue?

c# - 循环依赖 C# 项目与 Python 包

tomcat - 如何从在 tomcat 中运行的 Solr 中包含的应用程序登录

具有额外选项的 Python/Django 日志记录

asp.net-core - 如何使用内置的 Asp.Net 核心日志记录 (Microsoft.Extensions.Logging) 登录到数据库?

c# - 如何在 Linux 上安装特定版本的 nuget (2.12)?

c# - 如何在 ssis c# 脚本任务中添加 Microsoft Office Interop