Я изо всех сил пытаюсь найти способ зарегистрировать 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 в любом классе, который использует средство ведения журнала и вместо этого использует внедрение зависимостей.
Спасибо Радек





Для этого нужно реализовать, а затем зарегистрировать собственный строго типизированный класс Logger, производный от ILogger.
.Net Core позволяет регистрировать реализацию интерфейса универсального типа без указания типа. В этом случае это будет:
services.Add(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(MyLogging.Logger<>)));
Это позволяет всем классам, требующим ведения журнала, использовать внедрение конструктора следующим образом:
class A
{
public A(Ilogger<A> logger) {...}
}
Реализация ILogger, которая является оболочкой для log4net, должна быть достаточно простой. Пожалуйста, дайте мне знать, если вам понадобится пример.
Радек