【问题标题】:How to configure ConsoleLogger in console app?如何在控制台应用程序中配置 ConsoleLogger?
【发布时间】:2019-12-27 08:10:32
【问题描述】:

我正在尝试使用 .NET CORE 3.1 构建控制台应用程序,但在注入控制台记录器时遇到问题。

在最近的版本中,注入日志记录的方式似乎发生了显着变化,而且各种风格的教学教程似乎都不符合我的目标。

我有一个界面:

public interface IMyDoer
{
    void DoSomething();
}

还有一个我想注入 ILogger 的类:

public class MyDoer : IMyDoer
{
    private readonly ILogger logger;
    public MyDoer(ILogger logger)
    {
        this.logger = logger;
    }

    public void DoSomething()
    {
        this.logger.Log(LogLevel.Information, "Doing something");
    } 
}

然后我有我的 Main(),我试图在其中配置一个 DI 容器来构造一个 Doer 对象,配置 ILogger 以登录到控制台。

public class Program
{
    public static void Main(string[] args)
    {
        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        var serviceProvider serviceCollection.BuildServiceProvider();

        var myDoer = serviceProvider.GetService<IMyDoer>();

        myDoer.DoSomething();
    }

    private static void ConfigureServices(ServiceCollection serviceCollection)
    {
        serviceCollection.AddLogging(configure => {
            configure.AddConsole();
        });

        serviceCollection.AddSingleton<IMyDoer, MyDoer>();
    }
}

作为替代方案,我尝试过:

public class Program
{
    static void Main(string[] args)
    {
        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        using (var serviceProvider = serviceCollection.BuildServiceProvider())
        using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()))
        {
            var myDoer = serviceProvider.GetService<IMyDoer>();

            myDoer.DoSomething();
        }
    }

    private static void ConfigureServices(ServiceCollection serviceCollection)
    {
        serviceCollection
            .AddSingleton<IMyDoer, MyDoer>();
    }
}

无论哪种情况,我都会遇到异常:

System.InvalidOperationException
  HResult=0x80131509
  Message=Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'MyDoer.DoSomething'.
  Source=Microsoft.Extensions.DependencyInjection

关于我应该如何这样做的任何想法?

【问题讨论】:

    标签: c# asp.net-core .net-core


    【解决方案1】:

    ILogger 未在 ASP.NET Core DI 容器中注册。相反,请使用ILogger&lt;T&gt;:

    public class MyDoer : IMyDoer
    {
        private readonly ILogger<MyDoer> logger;
    
        public MyDoer(ILogger<MyDoer> logger)
        {
            this.logger = logger;
        }
    
        // ...
    }
    

    ILogger&lt;T&gt; 使用类型名称(YourNamespace.MyDoer)作为log category

    该类别包含在ILogger 的该实例创建的每条日志消息中。

    要设置您自己的日志类别并自己创建ILogger 的实现,请使用ILoggerFactory

    public class MyDoer : IMyDoer
    {
        private readonly ILogger logger;
    
        public MyDoer(ILoggerFactory loggerFactory)
        {
            this.logger = loggerFactory.CreateLogger("YourCategory");
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 1970-01-01
      • 2010-12-17
      • 2018-09-12
      • 2021-10-25
      • 2018-02-16
      • 2016-12-07
      • 1970-01-01
      • 2010-09-15
      相关资源
      最近更新 更多