2

我在.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()此类内部使用的要求和配置,正在记录到日志文件。

在此处输入图像描述

ConnectionStatusHandler被称为对Logger的logger更改时。Microsoft.Extensions.Logging.Logger

在此处输入图像描述

类中使用的记录器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();
  }
  
4

1 回答 1

1

看起来您的代码当前正在设置ILogger(未键入的)请求以解析为 Serilog,但Host.CreateDefaultBuilder()正在设置ILogger<T>为与 Microsoft 的 Logger 一起使用。

我建议使用Serilog.Extensions.Hosting来处理您的 Serilog 注册,这样您就可以添加UseSerilog()到您的主机构建器并完成。

于 2021-06-15T12:59:44.927 回答