【问题标题】:Config and Serilog sink with parameterised factory method使用参数化工厂方法配置和 Serilog 接收器
【发布时间】:2021-08-16 11:53:57
【问题描述】:

Serilog.Settings.Configuration 包支持将 Microsoft ILogger 配置设置与 Serilog 一起使用。

    "Console": {
      "LogLevel": {
        "Default": "Debug"
      }
    },

映射到这个(如果我理解正确的话)

.MinimumLevel.Override("Console", LogEventLevel.Debug)
.WriteTo.Console()

我编写了一个用于 MQTT 的自定义接收器。构造接收器的扩展方法需要参数。一个并不能真正表达为字符串。

.WriteTo.MqttSink(managedMqttClientObject, "name of application emitting logs")

我想将Serilog.Settings.Configuration 与我的自定义接收器结合使用,但可以就如何最好地解决这个问题提出建议。

目前的想法

  • 代码显式搜索配置值以确定是否要使用 MqttSink,如果是,则配置并应用它
  • 将参数设为sink类的静态属性,提供使用静态属性的无参数工厂方法,并在调用.ReadFrom.Configuration(config)之前编组它们的值

我也可以这样做

var loggerFactory = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.WriteTo.MqttSink(managedMqttClient, "log source name");

但我不确定当Serilog.Settings.Configuration 找不到无参数工厂方法MqttSink 时会发生什么。如果有比静态属性方法更好的方法,我非常感谢您的指导。

【问题讨论】:

    标签: c# .net-core serilog mqttnet


    【解决方案1】:

    这不是配置的工作方式。您需要一个 Serilog 部分。 readme file for the repository 中有一个示例。

    显然你的配置文件不能提供managedMqttClient,但是如果你添加一种方法来为定义工厂方法的类设置默认值,你可以使参数对于工厂方法是可选的。在工厂方法中,您可以回退到默认值,就像这样。

        public static void SetDefaults(
          IManagedMqttClient managedMqttClient, 
          string eventSource = null)
        {
          __eventSource = eventSource;
          __managedMqttClient = managedMqttClient;
        }
    
    ...
    
        public static LoggerConfiguration MqttSink(
                  this LoggerSinkConfiguration loggerConfiguration,
                  IManagedMqttClient managedMqttClient = null,
                  string eventSource = null,
                  IFormatProvider formatProvider = null)
        {
          var sink = new MqttSink(
            formatProvider, managedMqttClient ?? __managedMqttClient, 
            eventSource ?? __eventSource);
          var config = loggerConfiguration.Sink(sink);
          return config;
        }
    

    这种安排甚至可以让您使用配置文件覆盖“默认”事件源字符串,因为在 Serilog 配置中提供它会导致向工厂方法提供参数值。

      "Serilog": {
        "Using": [
          "Serilog.Sinks.Mqtt"
        ],
        "MinimumLevel": "Information",
        "WriteTo": [
          {
            "Name": "MqttSink",
            "Args": {
              "eventSource": "test-client"
            }
          }
        ]
      }
    

    假设上述配置,您的客户端代码可能如下所示。我可以从默认值中省略事件源,因为它是在配置中定义的。

    MqttSink.SetDefaults(managedMqttClient);
    var loggerFactory = new LoggerConfiguration().ReadFrom.Configuration(config);
    

    这些更改保留了原始调用签名,因此它们不会破坏任何现有代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多