【问题标题】:How to inject settings from appsettings.json to an ILoggerProvider?如何将 appsettings.json 中的设置注入 ILoggerProvider?
【发布时间】:2021-04-27 21:38:12
【问题描述】:

由于一些特殊要求,我正在实施自定义ILogger<T>,其中一个要求是在项目的appsettings.jsonLogging 部分内有一个部分,其中包含该记录器的配置值。问题是,在记录器中注入这些设置的正确方法(或好方法)是什么?我想我应该首先在相应的ILoggerProvider 中注入这些设置,并让提供者使用这些设置实例化一个记录器,但我不知道如何在提供者中正确注入这些值。

到目前为止,我在Program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging((context, logging) =>
                {
                    logging.ClearProviders();
                    logging.AddConfiguration(context.Configuration.GetSection("Logging"));
                    logging.AddConsole();
                    logging.AddProvider(new CustomLoggerProvider());
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

appsettings.json中的相关部分是:

"Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "CustomLogger": {
      "Level": "Error",
      "Url": "http://[URL]"
    }
  },

,提供者实现如下:

[ProviderAlias("CustomLogger")]
    public class CustomLoggerProvider : ILoggerProvider
    {
        private readonly Dictionary<string, CustomLogger> _loggers;
        private readonly LogLevel _level;
        
        private bool _already_disposed;

        public LogLevel Level
        {
            get => _level;
        }

        public CustomLoggerProvider()
        {
            //Here's where I don't know what should I do to inject the proper config values
            _level = LogLevel.Error;
        }

        public ILogger CreateLogger(string categoryName)
        {
            if (_loggers.ContainsKey(categoryName))
            {
                return _loggers[categoryName];
            }
            var l = new CustomLogger(this);
            _loggers.Add(categoryName, l);
            return l;
        }

        // Rest of implementation omitted for simplicity
    }

【问题讨论】:

    标签: configuration asp.net-core-3.1 ilogger


    【解决方案1】:

    我找到了一个可以接受的答案,我会在这里发布,以防有​​人需要。

    步骤是:

    • 实现您的ILoggerProvider 和您的ILogger。 Microsoft 页面上的示例是一个很好的指南。
    • 让您的ILoggerProvider 实现在其构造函数上接受所需的设置(通过IOptions&lt;T&gt; 或简单的参数;我正在使用一个名为MyCustomLoggerSettings 的选项对象)。
    • ILoggerProvider 中的Startup.ConfigureServices() 注册为单例,如下所示(假设我的实现称为MyCustomLoggerProvider):
    services.AddSingleton<ILoggerProvider>(p =>
    {
        var options = p.GetService<IOptions<MyCustomLoggerSettings>>();
        return new MyCustomLoggerProvider(options);
    });
    

    完成。

    作为奖励,通过这种方式,您可以将任何其他依赖项传递给此对象(包括在服务集合上注册的对象;在接受匿名函数的services 中使用方法重载将服务集合作为参数提供给您,在那里你可以使用GetService&lt;T&gt; 来解决任何依赖关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2017-11-23
      • 2020-11-19
      • 2021-04-24
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多