Регистрация log4net с именем logger .NET Core, поставщик услуг - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь найти способ регистрации log4net ILog в IServiceCollection сервисах (.NET Core 2.1).

log4net LogManager предоставляет метод, который принимает тип в качестве параметра, чтобы его можно было использовать прирегистрация событий.Вот пример вызова:

var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Однако, регистрируя его с помощью служб в методе запуска, я могу использовать фабричный преобразователь, но все равно тип будет всегда одинаковым.Смотрите следующий отрывок:

private void SetServices(IServiceCollection services)
{
    services.AddTransient(svc => CreateLog(MethodBase.GetCurrentMethod().DeclaringType)).;
}

protected ILog CreateLog(Type type)
{
    return LogManager.GetLogger(type);
}

Я ожидал, что svc (IServiceProvider) предоставит несколько способов добраться до фактически разрешаемого типа, но, похоже, ничего не происходит.Также использование отражения не поможет (IMO, но я могу ошибаться), потому что ILog активируется перед вызовом разрешенного типа ctor.

Но, возможно, есть какое-либо расширение на стороне MS или log4net, которое поможет решитьименованный регистратор, как объяснено в начале?

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

Спасибо, Радек

1 Ответ

0 голосов
/ 22 ноября 2018

Способ сделать это - реализовать и зарегистрировать свой собственный строго типизированный класс Logger, производный от ILogger.

.Net Core позволяет регистрировать реализацию интерфейса универсального типа без указания типа.В этом случае это будет:

services.Add(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(MyLogging.Logger<>)));

Это позволяет всем классам, для которых требуется ведение журнала, использовать инъекцию конструктора следующим образом:

class A
{
    public A(Ilogger<A> logger) {...}
}

Реализация ILogger, которой должна быть оболочка для log4netпросто.Пожалуйста, дайте мне знать, если вам нужен пример.

Радек

...