.net-core - 注册名为 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 的静态成员。
谢谢,拉德克
解决方案
这样做的方法是实现然后注册您自己的从 ILogger 派生的强类型 Logger 类。
.Net Core 允许 from 注册没有指定类型的泛型类型接口实现。在这种情况下,它将是:
services.Add(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(MyLogging.Logger<>)));
这允许所有需要记录的类使用构造函数注入,如下所示:
class A
{
public A(Ilogger<A> logger) {...}
}
ILogger 的实现,它是 log4net 的包装器,应该相当简单。如果您需要一个例子,请告诉我。
拉德克
推荐阅读
- python - 没有模型错误的用户名属性,甚至已经有对象 = UserManager()?
- firebase - Firestore - 适合用户特定数据的 NoSQL 结构
- tomcat - 标准项目 Java EE Servlets 在 Intellij IDEA 中不起作用
- c# - 如何重构此开关以消除 GOTO?
- ios - 如何使用 Swift 在 Alamofire 5 中检测上传进度和上传状态?
- rust - rust 如何使变量在不同的条件下具有不同的类型
- terraform - Terraform Cloudfront InvalidViewerCertificate
- python - AttributeError:“列表”对象在 ax.plt_wireframe() 中没有属性“ndim”
- eclipse - startsWith 方法在 Eclipse 中显示下划线
- gradle - 使用 Eclipse 导入 gradle 项目