Ошибка решения - Невозможно разрешить службу для типа Serilog.ILogger

Я пытаюсь реализовать SeriLog в основном приложении ASP.NET (.NET framework)

Ниже приведены шаги, которые я выполнил до сих пор:

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) Добавлены следующие строки в конструктор вашего класса запуска:

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

3) Добавлена ​​следующая строка в метод настройки вашего класса запуска:

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: невозможно разрешить службу для типа «Serilog.ILogger» при попытке активировать «AspNetCore_SeriLog_trial1.Controllers.HomeController». в Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
в lambda_method (Closure, IServiceProvider, Object []) в Microsoft.AspNetCore.Mvc.Internal.Type TInstance] (IServiceProvider serviceProvider, тип implementationType) в Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerActivator.Create (ControllerContext controllerContext) в Microsoft.AspNetCore.Mvc.Controllers.DefaultControllerFactory.Createc.Internal context ControllerActionInvoker.d__26.MoveNext ()

Может ли кто-нибудь помочь мне в этом? Отсутствует какая-либо конфигурация для Serilog?


person Sanket    schedule 20.11.2016    source источник
comment
Возможный дубликат Как зарегистрировать ILogger для инъекции в ASP.NET MVC 6   -  person Michael Freidgeim    schedule 15.09.2019


Ответы (6)


Попробуйте проделать следующее в вашем контроллере.

    ILogger<HomeController> logger = null;
    public HomeController(ILogger<HomeController> _logger)
    {
        logger = _logger;
    }
person dotnetstep    schedule 20.11.2016
comment
Я пробовал это, но получаю ошибку - Error CS0308 The non-generic type 'ILogger' cannot be used with type arguments - person Sanket; 20.11.2016
comment
Вы используете интерфейс seri ilogger, попробуйте заменить его интерфейсом Microsoft ilogger, который присутствует в библиотеке журналов. - person dotnetstep; 20.11.2016

Какая из следующих двух строк у вас в контроллере?

using Serilog;
using Microsoft.Extensions.Logging;

Если это первое (using Serilog;), то, вероятно, это ваша проблема.

Когда вы регистрируете службу, вы, по сути, говорите: «Когда конструктор запрашивает Microsoft.Extensions.Logging.ILogger, передайте им экземпляр Serilog, потому что я использую Serilog для ведения журнала», но затем в вашем конструкторе вы не запрашиваете Microsoft.Extensions.Logging.ILogger, вы запрашиваете Serilog.ILogger, и ваше приложение запутывается, потому что вы не определили службу как введено для Serilog.ILoger, вы определили его для Microsoft.Extensions.Logging.ILogger

Помните, что вы реализуете интерфейс Microsoft ILogger: вашему конструктору не нужно знать, что вы используете Serilog ... на самом деле, вы этого не хотите! Все дело в том, что вы можете в любое время поменять Serilog на другой регистратор без изменения кода.

Измените using Serilog; на using Microsoft.Extensions.Logging; в конструкторе, и вы будете запрашивать правильный тип службы.

person Jon Story    schedule 05.05.2020

Если вам нужно использовать ILogger (из Serilog) вместо ILogger<HomeController> (из Microsoft.Extensions.Logging), вы можете зарегистрировать ILogger в своем классе Startup:

services.AddSingleton(Log.Logger);
person Marcello    schedule 05.11.2020
comment
Я использовал это. Tnx! - person ticky; 07.04.2021

Вы пропустили внедрение своего интерфейса в конструктор контроллера:

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();
person Mselmi Ali    schedule 31.07.2019

Я знаю, что это старый вопрос, но я только что столкнулся с этой проблемой и нашел другое решение.

Я заменил Microsoft.Extensions.Logging на Serilog, но пропустил удаление его из списка параметров конструктора.

public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment, ILogger logger)

Как только я удалил этот параметр, ошибка исчезла.

public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)

Похоже, что OP пытался внедрить регистратор через конструктор, но вместо этого должен был создать конкретный регистратор для этого контроллера. Вы также можете сделать это static так, чтобы создавалось только одно средство ведения журнала для каждого запуска этого проекта вместо одного для каждого экземпляра класса. .

public class HomeController : Controller
{
    private static readonly ILogger Logger = Log.ForContext<HomeController>();
    ...

    public HomeController(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)
    {
    ...
    }

    ...
}

По-видимому, происходит то, что компилятор пытается предоставить конструктору регистратор Microsoft.Extensions.Logging по умолчанию, вместо того, чтобы пытаться сопоставить регистратор Serilog, который фактически ожидает конструктор, так что откуда возникает ошибка.

person computercarguy    schedule 28.12.2020

У меня возникла эта проблема, не удалось разрешить службу для типа interface_name при попытке активировать Controller_Name ....

Добавив следующую строку в startup.cs, я решил то же самое:

services.AddScoped<interface_name, Controller_Name>();
person Dushyant Singh Chouhan    schedule 31.07.2019