【问题标题】:How do I inject a service into a C# Dotnet Core ILogger?如何将服务注入 C# Dotnet Core ILogger?
【发布时间】:2021-02-28 14:35:22
【问题描述】:

我已关注https://docs.microsoft.com/en-us/dotnet/core/extensions/custom-logging-provider 创建自定义记录器。我希望这个自定义记录器让消息由服务处理 - 我将在 DI 容器中作为服务提供。例如,将日志消息发送到 SignalR 集线器的客户端。

但是,这是不可能的,因为 ILogger 初始化发生在 Startup.cs 代码之前。是否有任何推荐的方式将消息从 ILogger 传递到另一个服务?我想在 ConfigureLogging 之前注册它会起作用,但我想先知道是否有任何明显的好选择。

【问题讨论】:

  • 我认为你应该重新设计你的日志记录逻辑,记录器不应该依赖你自己的某些服务。您可以创建使用记录器的日志服务(基本上就像一个包装器,暴露与记录器相同的接口)。它允许您直接在日志服务中拦截调用。但是,这需要您直接使用日志记录服务而不是 ILogger。这适用于您的代码,但不适用于直接依赖 ILogger 的框架和第三方代码。
  • 我也认为为这些非平凡的场景使用自定义服务是有意义的。内置的建筑元素通常被证明是非常不灵活的,你最终可能很快就会把头撞到众所周知的墙上。使用包装记录器的自定义服务,您将拥有完全的灵活性,并且很容易实现。 IMyLogger FTW。 ;)
  • 嘿,我会尝试发布一些代码来说明这一点。我认为最终我确实需要重新设计系统。问题是我希望这是一个其他人可以使用的可插入库(如 Seq Serilog Appender/Seq ILogger appender)。所以在这种情况下我真的不能使用 IMyLogger。

标签: .net asp.net-core ilogger


【解决方案1】:

嘿, 尝试按照这个链接 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0

请提供有关您的目标的更多详细信息,但据我了解,如果您在启动时注册您的 ilogger,您可以随时在发送消息服务中调用它

【讨论】:

  • 恐怕我正试图做相反的事情 - 我不希望服务使用记录器,我希望记录器使用服务。但如果没有一些痛苦的补充,我认为这是不可能的。
猜你喜欢
  • 2018-08-08
  • 2017-09-17
  • 2021-08-14
  • 2021-12-17
  • 1970-01-01
  • 2022-01-26
  • 2022-01-18
  • 1970-01-01
  • 2022-08-15
相关资源
最近更新 更多