【问题标题】:Custom Loggingwithout Contsructor DI没有构造函数 DI 的自定义日志记录
【发布时间】:2020-12-08 20:20:59
【问题描述】:

如何根据在每个类中没有构造函数依赖注入而注册的提供程序来记录自定义信息/错误? (因为我在控制器内部调用了单个控制器多个存储库,并且我无法更改存储库 i,e 类构造函数)

例如,我想在不接触控制器构造器的情况下在以下上下文中记录信息

public override void OnException(ExceptionContext context)
        {
            base.OnException(context);
            var logger = Dependency.Resolve<ILogger>();
            **//var logger = getIloggerSomehow from startup regsistred loggers**

            logger.LogInformation("Custom Info");

        }

我的启动服务如下所示,它在我期望的任何地方写入 dotnet 和 Microosft 日志。 我如何在所有这些地方编写自定义日志?

services.AddLogging(loggingBuilder =>
              {
                    loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));                    loggingBuilder.AddAWSProvider(Configuration.GetAWSLoggingConfigSection());
                loggingBuilder.SetMinimumLevel(LogLevel.Debug);
                loggingBuilder.AddConsole();
                loggingBuilder.AddDebug();
            });

【问题讨论】:

  • 为什么?这将对 DI 容器的引用进行硬编码,正是ILogger 旨在防止的。您现在不仅仅依赖于日志库,而是依赖于日志库特定的 DI 库
  • @PanagiotisKanavos,谢谢。否则我如何在此处添加自定义日志记录,它将分发给所有提供者
  • 您可以使用a singleton LoggingFactory 并根据需要使用它来创建记录器,甚至可以创建单例记录器。这样可以避免依赖 DI 容器。再次why 很重要
  • how can i add the custom logging here whihc will be distributed to all providers 通过在AddLogging 中配置日志记录。构造函数注入使这更容易,而不是更难 - 注入不会影响日志记录的工作方式,但您不必查看多个位置来创建记录器,也不必您必须担心缺少记录器字段。那句话是什么意思呢?您是指哪种自定义日志记录?
  • 基本上我需要全局日志对象,我可以使用它通过应用程序记录.LogInformation()

标签: c# asp.net-core logging .net-core dependency-injection


【解决方案1】:

您可以在OnException 方法中从context 解析服务:

using Microsoft.Extensions.DependencyInjection;
...
var service = context.HttpContext.RequestServices.GetService<ILogger<YourFilter>>();

【讨论】:

  • var logger = context.HttpContext.RequestServices.GetService();始终为空
  • 那你是怎么注册ILogger的?
  • 或者你想解析ILogger&lt;T&gt;?只需将T 替换为过滤器的类型即可。查看我的编辑。
  • 我已经在 services.AddLogging(loggingBuilder => { loggingBuilder.AddConfiguration(Configuration.GetSection("Logging")); loggingBuilder.AddAWSProvider(Configuration.GetAWSLoggingConfigSection()); loggingBuilder.SetMinimumLevel 下注册了 Ilogger sa (LogLevel.Debug); loggingBuilder.AddConsole(); loggingBuilder.AddDebug(); });
  • 你试过context.HttpContext.RequestServices.GetService&lt;ILogger&lt;YourClass&gt;&gt;();吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-25
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2019-11-15
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多