【发布时间】:2018-02-11 07:36:34
【问题描述】:
MS 文档文章"Introduction to Logging in ASP.NET Core" 给出了 2 个构造函数注入示例
-
使用 ILogger
private readonly ILogger _logger; public TodoController(ILogger<TodoController> logger) { _logger = logger; } -
和ILoggerFactory
private readonly ILogger _logger; public TodoController( ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<TodoController>(); }
我的问题是我应该将什么传递给从我的控制器调用的 child 类
将 ILoggerFactory 传递给从控制器调用的子类,然后 在每个班级电话中
LoggerFactoryExtensions.CreateLogger<MyChildClass>()或将父控制器的
ILogger<MyController>传递给每个子类 从控制器创建并具有非泛型参数 ILogger。
在日志中,我更喜欢为每个类查看单独的类别“MyChildClass”,而不是所有类都使用父控制器中的类别“MyController”。
然而,每个对象构造中的 CreateLogger 可能是一项昂贵的操作(例如,参见 https://github.com/aspnet/Logging/issues/524)
您会推荐哪个选项?您能建议任何其他方法吗?
【问题讨论】:
-
让子类注入自己的记录器,然后将子类注入控制器。这样子记录器将在子类被解析并注入控制器时得到解析。
-
我想说注入
ILogger<T>和ILoggerFactory都是不好的方法。注入ILoggerFactory会使你的构造函数变为do too much,而ILogger<T>只会给你的代码增加更多噪音。相反,您应该注入一个非通用的ILogger,并让 DI 基础设施自动为您注入正确的记录器。然而,MS 文档没有显示这一点的原因是内置容器太有限了。它不能那样为你注入ILogger。 -
@Steven:更高级的依赖注入库是否能够将具有当前类名称的类别的记录器传递给非泛型 ILogger 参数?或者我需要在每个构造函数中插入类别名称?
-
我认为所有流行的 DI 库都支持这个。
-
@steven,为了记录asp.net内部的东西-需要使用
Microsoft.Extendions.DependencyInjection注册一个记录器-比如说Serilog-然后需要插入-比如说-autofac(简单),然后注册在 autofac 中再次使用 Serilog?
标签: c# asp.net-core logging dependency-injection .net-core