Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行Asp.NETCore2的Webapi 2上使用Serilog的DiiLogger_C#_Logging_Asp.net Core 2.0_Serilog - Fatal编程技术网

C# 在运行Asp.NETCore2的Webapi 2上使用Serilog的DiiLogger

C# 在运行Asp.NETCore2的Webapi 2上使用Serilog的DiiLogger,c#,logging,asp.net-core-2.0,serilog,C#,Logging,Asp.net Core 2.0,Serilog,我正试图用Asp.NETCore2(MSSQLServer集成)将Serilog集成到我的WebApi 2中 我已经添加了nuget包,然后将以下内容添加到我的 public async void Configure(IApplicationBuilder应用程序、IHostingEnvironment环境、ILoggerFactory loggerFactory) 在myProgram.cs中,我有默认值 public static IWebHost BuildWebHost(stri

我正试图用Asp.NETCore2(MSSQLServer集成)将Serilog集成到我的WebApi 2中

我已经添加了nuget包,然后将以下内容添加到我的

public async void Configure(IApplicationBuilder应用程序、IHostingEnvironment环境、ILoggerFactory loggerFactory)

在my
Program.cs
中,我有默认值

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
我得到以下错误

InvalidOperationException:在尝试激活“WebApi.Controller.TraderContactController”时,无法解析类型“Microsoft.Extensions.Logging.ILogger”的服务


我是否需要在Startup.cs中为
ILogger
物理设置一个单例。有人能告诉我这里缺少什么吗?正如我所设想的,因为日志记录内置于核心管道中,所以它知道如何解决这一问题。

您需要重构控制器,以期望通用记录器
ILogger
,它是从
ILogger
派生的

[Route("api/[controller]")]
public class TraderController : Controller {
    private TraderService _service;
    private readonly ILogger _logger;

    public TraderController(
            Func<IBemfeitoDataContext> context, 
            ILogger<TraderController> logger //<-- note the change here
    ) { 
        _service = new TraderService(context, logger);
        _logger = logger;
    }
}
服务还应固定为依赖于
ILogger

公共类TraderService:ITraderService{
专用只读ILogger记录器;
public TraderService(函数上下文,ILogger记录器){
this.logger=记录器;
//...
}
//…为简洁起见,删除了代码
}
控制器应该重构为依赖于服务抽象而不是实现

[Route("api/[controller]")]
public class TraderController : Controller {
    private readonly ITraderService service;
    private readonly ILogger logger;

    public TraderController(ITraderService service, ILogger<TraderController> logger) { 
        this.service = service;
        this.logger = logger;
    }

    //...
}
[路由(“api/[控制器]”)]
公共类TraderController:控制器{
专用只读ITraderService服务;
专用只读ILogger记录器;
公共交易控制器(ITraderService服务,ILogger记录器){
服务=服务;
this.logger=记录器;
}
//...
}
所有涉及的类在解析时都将显式地注入它们的依赖项


此答案假设
ITraderService
TraderService
已在DI容器中注册。

同时注入
ILogger工厂
和通用
ILogger
。这意味着您的控制器可以如下所示:

   [Route("api/[controller]")]
   public class TraderController : Controller {
       private readonly ITraderService service;
       private readonly ILogger logger;
       public TraderController(ITraderService service, ILoggerFactory loggerFactory) 
       { 
           this.service = service;
           this.logger = loggerFactory.CreateLogger<TraderController>();
       }
       //...
   }
[路由(“api/[控制器]”)]
公共类TraderController:控制器{
专用只读ITraderService服务;
专用只读ILogger记录器;
公共交易控制器(ITraderService服务,iLogger工厂loggerFactory)
{ 
服务=服务;
this.logger=loggerFactory.CreateLogger();
}
//...
}

那太好了,谢谢你清理了它,因为它被键入了,这对传递给我的
TraderService
的记录器有任何影响吗?@MatthewFlynn假设
TraderService
要求
ILogger
,并且不希望通过DI容器解决,它应该可以正常工作。谢谢你的帮助。@MatthewFlynn我很好奇为什么它是显式创建的,而不是注入到控制器中。对不起,你能稍微扩展一下吗?我是不是处理错了?如果有更好的方法,那就是一个绿地项目,这样我可以改变它
public class TraderService : ITraderService {
    private readonly ILogger logger;

    public TraderService(Func<IBemfeitoDataContext> context, ILogger logger) {
        this.logger = logger;

        //...
    }

    //...code removed for brevity
}
public class TraderService : ITraderService {
    private readonly ILogger logger;

    public TraderService(Func<IBemfeitoDataContext> context, ILogger<TraderService> logger) {
        this.logger = logger;
        //...
    }

    //...code removed for brevity
}
[Route("api/[controller]")]
public class TraderController : Controller {
    private readonly ITraderService service;
    private readonly ILogger logger;

    public TraderController(ITraderService service, ILogger<TraderController> logger) { 
        this.service = service;
        this.logger = logger;
    }

    //...
}
   [Route("api/[controller]")]
   public class TraderController : Controller {
       private readonly ITraderService service;
       private readonly ILogger logger;
       public TraderController(ITraderService service, ILoggerFactory loggerFactory) 
       { 
           this.service = service;
           this.logger = loggerFactory.CreateLogger<TraderController>();
       }
       //...
   }