在托管服务中注入现有记录器

问题描述

我在 .net core 3.1 中拥有该项目。我已配置为使用 SeriLog 作为记录器。

其中一项服务 MqttComunicationClient 将记录器注入到使用 serilog 配置的构造函数中。这里的 ILoggerMicrosoft.Extensions.Logging

public MqttCommunicationClient(
            IMqttCommunicationConfiguration mqttConfiguration,ILogger logger,)
        {
            this.mqttConfiguration = mqttConfiguration;
            this.logger = logger;            
        }

从这个类的 Init 方法中,我正在初始化自定义编写的 MQTT API。

public void Initialize()
        {
            var mqttClientId = $"{DefaultClientIdPattern}{Environment.MachineName}";

            serviceHost = Host.CreateDefaultBuilder()
                  .UseMQTTApi(opt =>
                  {                          
                      opt.UserName = "test";
                      opt.Password = "test";
                  })
                  .ConfigureServices(services =>
                  {
                      services.AddSingleton(logger);                           
                  })
                  .ConfigureHostConfiguration(c => { c.Build(); })
                  .Start();

            managedMqttClient = serviceHost.Services.GetRequiredService<IManagedMqttClient>();
        }

我的 MQTT Api 具有处理程序,这些处理程序将在接收到指定主题的消息时触发。

其中一个处理程序具有以下构造函数。

public ConnectionStatusHandler(
         ILogger<ConnectionStatus> logger,IDeviceCommunications deviceCommunications)         
        {
            this.logger = logger;
            this.deviceCommunications = deviceCommunications;
        }

现在的问题是当我调试我的 MqttComunicationClient 时,记录器被配置为 SeriLog。根据该类中使用的要求和配置,logger.LogInformation() 正在记录到日志文件。

enter image description here

当调用 ConnectionStatusHandler 时,logger 会更改为 Microsoft.Extensions.Logging.Logger 记录器。

enter image description here

ConnectionStatusHandler 类中使用的记录器仅记录到控制台,而不记录到文件中。

如何将相同的 serilog 配置的 logger 对象从 MqttComunicationClient 传递到 ConnectionStatusHandler ? 我需要一些额外的设置吗?我是新手,因此非常感谢您的帮助。

编辑serilog 配置为记录器

的代码
public IServiceProvider CreateServiceProvider(string basePath)
  {
     var configuration = GetConfiguration(basePath);
     
     var logger = CreateLogger(configuration);
     var services = new ServiceCollection();
     services.AddSingleton(logger);
     return services.BuildServiceProvider();
  }

protected virtual ILogger CreateLogger(IConfiguration configuration)
  {
     return LogBuilder.CreateLogger(null,configuration);
  }
  
// Serilog configured here
public static ILogger CreateLogger(string categoryName,IConfiguration configuration,Action<string> selfLogAction = null)
  {
     var serilogLogger = new LoggerConfiguration()
                           .ReadFrom.Configuration(configuration)
                           .CreateLogger();

     using (var serilogLoggerProvider = new SerilogLoggerProvider(serilogLogger))
     {
        var logger = serilogLoggerProvider.CreateLogger(categoryName);

        if (selfLogAction != null)
        {
           Serilog.Debugging.SelfLog.Enable(selfLogAction);
        }

        return logger;
     }
  } 

// This method reads the configuration from the config json file.
protected virtual IConfiguration GetConfiguration(string basePath)
  {
     StringBuilder configLog = null;
     var mainConfiguration = new ConfigurationBuilder()
        .SetBasePath(basePath)
        .AddJsonFile("mytest.config.json")
        .Build();
     var builder = new ConfigurationBuilder();
     return BuildConfiguration(builder,mainConfiguration,basePath,configLog)
        .Build();
  }
  

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)