【问题标题】:netcore: create a console logger using LoggerBuilder from a test controllernet core:使用来自测试控制器的 Logger Builder 创建控制台日志
【发布时间】:2019-01-24 00:20:11
【问题描述】:

我有一个测试项目,我在其中设置了一个这样的 http 客户端:

public class TestContext : IDisposable
{
    private TestServer _server;
    public HttpClient Client { get; private set; }

    public TestContext() {
        SetUpClient();
    }

    private void SetUpClient()
    {
        _server = new TestServer(new WebHostBuilder()
            .ConfigureAppConfiguration((builderContext, config) => {
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            })
            .UseStartup<Startup>()
            .ConfigureServices( services => {
                // ...
            })
        );
        Client = _server.CreateClient();
    }
}

使用要测试的项目的 Startup 类。

在我的基础 TestController 中,我正在实例化一个控制台记录器,如下所示:

public WSTestController() {
    _log = new LoggerFactory().AddConsole().CreateLogger(this.GetType().Name);
    var testContext = new TestContext();
    _client = testContext.Client;
    // _services = testContext.Services;
}

现在我收到以下警告:

controllers\WSTestController.cs(22,20): warning CS0618: 
'ConsoleLoggerExtensions.AddConsole(ILoggerFactory)' is obsolete: 
'This method is obsolete and will be removed in a future version. 
The recommended alternative is AddConsole(this ILoggingBuilder builder).' 

我无法使用 DI 获取记录器,知道如何使用构建器而不是即将弃用的 LoggerFactory 吗???

--

我尝试使用@max-brodin 回答,但出现以下错误:

The following constructor parameters did not have matching fixture data: ILogger log

我猜是因为类 WSTestController 不是使用 new WebHostBuilder() 调用创建的服务器的控制器,所以它不是由 de 依赖注入容器管理的。

我也尝试公开 app.serviceProvider,然后使用 this.ServiceProvider.GetService(typeof(ILogger));,但它返回 null。

我只是无法从测试 TestServer 的类中获取控制台记录器

【问题讨论】:

标签: c# logging .net-core loggerfactory


【解决方案1】:

为了使用从 .Net Core 2.2 开始的 DI 解析 ILogger&lt;&gt;,您应该使用 ConfigureLogging 扩展方法向 loggerbuilder 注册它:

_server = new TestServer(new WebHostBuilder()
        .ConfigureAppConfiguration((builderContext, config) => {
            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        })
        .UseStartup<Startup>()
        .ConfigureServices( services => {
            // ...
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
           logging.AddConsole();
        })
    );

然后你可以像往常一样将它注入到你的控制器中。

public class WSTestController : Controller
{ 
    private readonly ILogger<WSTestController> _logger;

    public WSTestController(ILogger<WSTestController> logger)
    {
       _logger = logger;
    }

}

查看详情:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2

【讨论】:

  • 非常感谢,但我试过了,还是不行,我更新了问题
猜你喜欢
  • 1970-01-01
  • 2010-10-07
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2019-02-26
  • 2018-06-10
相关资源
最近更新 更多