0

ILogger<T>由于一些特殊要求,我正在实施自定义,其中一个要求是Logging在项目的部分内有一个部分,appsettings.json其中包含该记录器的配置值。问题是,将这些设置注入记录器的正确方法(或好方法)是什么?我认为我应该首先在相应的设置中注入这些设置,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
    }
4

1 回答 1

1

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

步骤是:

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

完毕。

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

于 2021-05-02T21:57:27.843 回答