如何在appsettings.json中设置我自己的KeyGenerator实例?

时间:2017-09-06 18:41:56

标签: json azure-table-storage serilog asp.net-core-2.0

我已经问过这个问题here,但我觉得Stackoverflow可能会更快。这就是我在json配置文件中尝试的方法:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.AzureTableStorage" ],
    "WriteTo": [
      {
        "Name": "AzureTableStorage",
        "Args": {
          "storageTableName": "Logs",
          "connectionString": "*************",
          "keyGenerator": "MyApp.Serilog.AzureTableStorage.MyKeyGenerator"
        }
      }
    ],
    "MinimumLevel": "Verbose"
  }
}

这是我的生成器实现:

public class MyKeyGenerator : IKeyGenerator
{
    public string GeneratePartitionKey(LogEvent logEvent)
    {
        return Environment.MachineName;
    }

    public string GenerateRowKey(LogEvent logEvent, string suffix = null)
    {
        return SUID.nextId().ToString();
    }
}

显然,.ReadFrom.Configuration操作会抛出InvalidCastException,因为它会尝试将字符串内容放入IKeyGenerator参数中。

如何设置keyGenerator参数以确保创建MyKeyGenerator类的实例并将其赋予该参数?

1 个答案:

答案 0 :(得分:4)

我克隆了serilog-settings-configuration,在深入研究代码后,我发现当实际参数是一个接口时,他们如何期望JSON设置值(参见StringArgumentValue.cs,第57到74行)。

引用要作为参数传递的类型的正确方法是使用逗号分隔完整的类和程序集名称。该类也必须具有公共默认构造函数

例如:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.AzureTableStorage" ],
    "WriteTo": [
      {
        "Name": "AzureTableStorage",
        "Args": {
          "storageTableName": "Logs",
          "connectionString": "*************",
          "keyGenerator": "MyApp.Serilog.AzureTableStorage.MyKeyGenerator, MyApp"
        }
      }
    ],
    "MinimumLevel": "Verbose"
  }
}

这样,配置程序可以正确地实现该类!