解决错误 - 无法解析"Serilog.ILogger"类型的服务

San*_*ket 14 serilog asp.net-core-mvc asp.net-core

我试图在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"
Run Code Online (Sandbox Code Playgroud)

2)在Startup类的构造函数中添加以下行 -

Log.Logger = new LoggerConfiguration()
           .MinimumLevel.Debug()
           .WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "log-{Date}.txt"))
           .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

3)在Startup类的configure方法中添加以下行 -

loggerFactory.AddSerilog();
Run Code Online (Sandbox Code Playgroud)

4)将记录器注入HomeController,如下所示 -

ILogger logger;

    public HomeController(ILogger logger)
    {
        this.logger = logger;
    }
Run Code Online (Sandbox Code Playgroud)

5)在About操作中,尝试记录此类异常 -

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();
    }
Run Code Online (Sandbox Code Playgroud)

在运行我的应用程序时,我收到以下错误 -

System.InvalidOperationException:尝试激活'AspNetCore_SeriLog_trial1.Controllers.HomeController'时,无法解析类型'Serilog.ILogger'的服务.在Microsoft.AspNetCore.Mvc.Internal.TypeActivatorCache.CreateInstance
[TInstance]的lambda_method(Closure,IServiceProvider,Object [])上的Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)IServiceProvider serviceProvider,Type implementationType),位于Microsoft.AspNetCore.Mvc.Inv.Inter.ControllerActionInvoker.d__26的Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerFactory.CreateController(ControllerContext context)中的Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerActivator.Create(ControllerContext controllerContext). .MoveNext()

有人可以帮我这个吗?Serilog缺少任何配置?

dot*_*tep 26

尝试在控制器中执行以下操作.

    ILogger<HomeController> logger = null;
    public HomeController(ILogger<HomeController> _logger)
    {
        logger = _logger;
    }
Run Code Online (Sandbox Code Playgroud)

  • 您是否正在使用seri ilogger接口,然后尝试将其替换为日志库中的Microsoft ilogger接口. (4认同)

Mar*_*llo 11

如果您需要使用ILogger(from Serilog) 而不是ILogger<HomeController>(from Microsoft.Extensions.Logging),您可以ILogger在 Startup 类上注册:

services.AddSingleton(Log.Logger);
Run Code Online (Sandbox Code Playgroud)


Jon*_*ory 9

您的控制器中有以下哪两行?

using Serilog;
using Microsoft.Extensions.Logging;
Run Code Online (Sandbox Code Playgroud)

如果是前者 ( using Serilog;) 那么那可能是你的问题。

当您注册服务时,您实际上是在说“当构造函数要求 Microsoft.Extensions.Logging.ILogger 时,向它们传递一个 Serilog 实例,因为我正在使用 Serilog 进行日志记录”,但是在您的构造函数中,您不是' t 要求 Microsoft.Extensions.Logging.ILogger,您要求Serilog.ILogger并且您的应用程序变得混乱,因为您还没有定义要注入的服务Serilog.ILoger,您已经定义了一个 forMicrosoft.Extensions.Logging.ILogger

请记住,您正在实现 Microsoft 的 ILogger 接口:您的构造函数不需要知道您正在使用 Serilog……事实上,您并不希望它知道!重点是您可以随时将 Serilog 换成不同的记录器,而无需更改代码。

在构造函数中更改using Serilog;using Microsoft.Extensions.Logging;,您将请求正确的服务类型