首页 > 解决方案 > 注册名为 logger .NET Core 服务提供者的 log4net

问题描述

我正在努力寻找一种在IServiceCollection服务(.NET Core 2.1)中注册 log4net ILog 的方法。

log4net LogManager 提供了一个以 Type 作为参数的方法,以便在记录事件时可以使用它。这是一个示例调用:

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

但是,当在 Startup 方法中使用服务注册它时,我可以使用工厂解析器,但类型仍将始终相同。请参阅以下摘录:

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 的静态成员。

谢谢,拉德克

标签: .net-corelog4netasp.net-core-2.1.net-core-2.1

解决方案


这样做的方法是实现然后注册您自己的从 ILogger 派生的强类型 Logger 类。

.Net Core 允许 from 注册没有指定类型的泛型类型接口实现。在这种情况下,它将是:

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

这允许所有需要记录的类使用构造函数注入,如下所示:

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

ILogger 的实现,它是 log4net 的包装器,应该相当简单。如果您需要一个例子,请告诉我。

拉德克


推荐阅读