解决错误 - 无法解析类型 'Serilog.ILogger' 的服务
Solving error - Unable to resolve service for type 'Serilog.ILogger'
我正在尝试在 ASP.NET 核心应用程序(.NET 框架)
中实施 SeriLog
以下是我到目前为止执行的步骤-
1) 在 Project.json
中添加了以下参考
"Serilog": "2.2.0",
"Serilog.Extensions.Logging": "1.2.0",
"Serilog.Sinks.RollingFile": "2.0.0",
"Serilog.Sinks.File": "3.0.0"
2) 在 Startup class-
的构造函数中添加了以下行
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "log-{Date}.txt"))
.CreateLogger();
3) 在启动的配置方法中添加了以下行 class-
loggerFactory.AddSerilog();
4) 像这样将记录器注入 HomeController-
ILogger logger;
public HomeController(ILogger logger)
{
this.logger = logger;
}
5) 在“关于”操作中,尝试像这样记录异常-
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
try
{
throw new Exception("Serilog Testing");
}
catch (System.Exception ex)
{
this.logger.Error(ex.Message);
}
return View();
}
在 运行 我的应用程序中,我遇到以下错误 -
System.InvalidOperationException: Unable to resolve service for type
'Serilog.ILogger' while attempting to activate
'AspNetCore_SeriLog_trial1.Controllers.HomeController'. at
Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider
sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
at lambda_method(Closure , IServiceProvider , Object[] ) at
Microsoft.AspNetCore.Mvc.Internal.TypeActivatorCache.CreateInstance[TInstance](IServiceProvider
serviceProvider, Type implementationType) at
Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerActivator.Create(ControllerContext
controllerContext) at
Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerFactory.CreateController(ControllerContext
context) at
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__26.MoveNext()
谁能帮我解决这个问题? Serilog 是否缺少任何配置?
尝试在您的控制器中执行以下操作。
ILogger<HomeController> logger = null;
public HomeController(ILogger<HomeController> _logger)
{
logger = _logger;
}
我遇到了这个问题“在尝试激活 'Controller_Name' 时无法解析类型 'interface_name' 的服务....
通过在 startup.cs 中添加以下行,我已经解决了同样的问题:
services.AddScoped<interface_name, Controller_Name>();
您错过了在控制器构造函数中注入您的接口:
ILogger<HomeController> logger = null;
public HomeController(ILogger<HomeController> _logger)
{
logger = _logger;
}
在 Program.cs 中你还必须添加 UseSerilog:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog();
您的控制器中有以下两行中的哪一行?
using Serilog;
using Microsoft.Extensions.Logging;
如果是前者 (using Serilog;
),那可能是你的问题。
当您注册服务时,您实际上是在说 "When a constructor asks for an Microsoft.Extensions.Logging.ILogger, pass them a Serilog instance because I'm using Serilog for my logging",但是在您的构造函数中 您并不是在请求 Microsoft.Extensions.Logging.ILogger,您正在请求 Serilog.ILogger 并且您的应用程序感到困惑,因为您没有定义要为 Serilog.ILoger
注入的服务,您已经为Microsoft.Extensions.Logging.ILogger
请记住,您正在实现 Microsoft 的 ILogger 接口:您的构造函数不需要知道您正在使用 Serilog……事实上,您不希望它知道!重点是您可以随时将 Serilog 换成不同的记录器,而无需更改代码。
在构造函数中将 using Serilog;
更改为 using Microsoft.Extensions.Logging;
,您将请求正确的服务类型
如果您需要使用 ILogger
(来自 Serilog
)而不是 ILogger<HomeController>
(来自 Microsoft.Extensions.Logging
),您可以在您的 Startup 上注册 ILogger
class:
services.AddSingleton(Log.Logger);
我知道这是一个老问题,但我只是 运行 解决了这个问题并找到了不同的解决方案。
我将 Microsoft.Extensions.Logging
换成了 Serilog
,但我错过了从构造函数参数列表中删除它的机会。
public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment, ILogger logger)
删除该参数后,错误消失了。
public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)
看起来 OP 试图通过构造函数注入记录器,但应该为该控制器创建一个特定的记录器。你也可以static
所以there's only 1 creation of the logger for every time this project runs, instead of 1 for every instance of the class.
public class HomeController : Controller
{
private static readonly ILogger Logger = Log.ForContext<HomeController>();
...
public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)
{
...
}
...
}
显然,发生的事情是编译器试图默认给构造函数一个 Microsoft.Extensions.Logging
记录器,而不是试图匹配构造函数实际期望的 Serilog
记录器,所以这就是错误来自。
我正在尝试在 ASP.NET 核心应用程序(.NET 框架)
中实施 SeriLog以下是我到目前为止执行的步骤-
1) 在 Project.json
中添加了以下参考"Serilog": "2.2.0",
"Serilog.Extensions.Logging": "1.2.0",
"Serilog.Sinks.RollingFile": "2.0.0",
"Serilog.Sinks.File": "3.0.0"
2) 在 Startup class-
的构造函数中添加了以下行Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "log-{Date}.txt"))
.CreateLogger();
3) 在启动的配置方法中添加了以下行 class-
loggerFactory.AddSerilog();
4) 像这样将记录器注入 HomeController-
ILogger logger;
public HomeController(ILogger logger)
{
this.logger = logger;
}
5) 在“关于”操作中,尝试像这样记录异常-
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
try
{
throw new Exception("Serilog Testing");
}
catch (System.Exception ex)
{
this.logger.Error(ex.Message);
}
return View();
}
在 运行 我的应用程序中,我遇到以下错误 -
System.InvalidOperationException: Unable to resolve service for type 'Serilog.ILogger' while attempting to activate 'AspNetCore_SeriLog_trial1.Controllers.HomeController'. at Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
at lambda_method(Closure , IServiceProvider , Object[] ) at Microsoft.AspNetCore.Mvc.Internal.TypeActivatorCache.CreateInstance[TInstance](IServiceProvider serviceProvider, Type implementationType) at Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerActivator.Create(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerFactory.CreateController(ControllerContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__26.MoveNext()
谁能帮我解决这个问题? Serilog 是否缺少任何配置?
尝试在您的控制器中执行以下操作。
ILogger<HomeController> logger = null;
public HomeController(ILogger<HomeController> _logger)
{
logger = _logger;
}
我遇到了这个问题“在尝试激活 'Controller_Name' 时无法解析类型 'interface_name' 的服务....
通过在 startup.cs 中添加以下行,我已经解决了同样的问题:
services.AddScoped<interface_name, Controller_Name>();
您错过了在控制器构造函数中注入您的接口:
ILogger<HomeController> logger = null;
public HomeController(ILogger<HomeController> _logger)
{
logger = _logger;
}
在 Program.cs 中你还必须添加 UseSerilog:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog();
您的控制器中有以下两行中的哪一行?
using Serilog;
using Microsoft.Extensions.Logging;
如果是前者 (using Serilog;
),那可能是你的问题。
当您注册服务时,您实际上是在说 "When a constructor asks for an Microsoft.Extensions.Logging.ILogger, pass them a Serilog instance because I'm using Serilog for my logging",但是在您的构造函数中 您并不是在请求 Microsoft.Extensions.Logging.ILogger,您正在请求 Serilog.ILogger 并且您的应用程序感到困惑,因为您没有定义要为 Serilog.ILoger
注入的服务,您已经为Microsoft.Extensions.Logging.ILogger
请记住,您正在实现 Microsoft 的 ILogger 接口:您的构造函数不需要知道您正在使用 Serilog……事实上,您不希望它知道!重点是您可以随时将 Serilog 换成不同的记录器,而无需更改代码。
在构造函数中将 using Serilog;
更改为 using Microsoft.Extensions.Logging;
,您将请求正确的服务类型
如果您需要使用 ILogger
(来自 Serilog
)而不是 ILogger<HomeController>
(来自 Microsoft.Extensions.Logging
),您可以在您的 Startup 上注册 ILogger
class:
services.AddSingleton(Log.Logger);
我知道这是一个老问题,但我只是 运行 解决了这个问题并找到了不同的解决方案。
我将 Microsoft.Extensions.Logging
换成了 Serilog
,但我错过了从构造函数参数列表中删除它的机会。
public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment, ILogger logger)
删除该参数后,错误消失了。
public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)
看起来 OP 试图通过构造函数注入记录器,但应该为该控制器创建一个特定的记录器。你也可以static
所以there's only 1 creation of the logger for every time this project runs, instead of 1 for every instance of the class.
public class HomeController : Controller
{
private static readonly ILogger Logger = Log.ForContext<HomeController>();
...
public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)
{
...
}
...
}
显然,发生的事情是编译器试图默认给构造函数一个 Microsoft.Extensions.Logging
记录器,而不是试图匹配构造函数实际期望的 Serilog
记录器,所以这就是错误来自。