使用参数化工厂方法配置和 Serilog sink
Config and Serilog sink with parameterised factory method
包 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,如果是,则配置并应用它
- 使参数成为接收器的静态属性 class,提供使用静态属性的无参数工厂方法,并在调用
.ReadFrom.Configuration(config)
之前编组它们的值
我也可以这样做
var loggerFactory = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.WriteTo.MqttSink(managedMqttClient, "log source name");
但我不太确定当 Serilog.Settings.Configuration
找不到无参数工厂方法 MqttSink
时会发生什么。如果有比静态 属性 方法更好的方法,我将非常感谢您的指导。
这不是配置的工作原理。您需要一个 Serilog 部分。 readme file for the repository.
中有一个示例
显然你的配置文件不能提供 managedMqttClient
但如果你添加一种方法来设置默认值到定义工厂方法的 class ,你可以使工厂方法的参数可选.在工厂方法中,您可以回退到默认值,像这样。
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);
这些更改保留了原始调用签名,因此它们不会破坏任何现有代码。
包 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,如果是,则配置并应用它
- 使参数成为接收器的静态属性 class,提供使用静态属性的无参数工厂方法,并在调用
.ReadFrom.Configuration(config)
之前编组它们的值
我也可以这样做
var loggerFactory = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.WriteTo.MqttSink(managedMqttClient, "log source name");
但我不太确定当 Serilog.Settings.Configuration
找不到无参数工厂方法 MqttSink
时会发生什么。如果有比静态 属性 方法更好的方法,我将非常感谢您的指导。
这不是配置的工作原理。您需要一个 Serilog 部分。 readme file for the repository.
中有一个示例显然你的配置文件不能提供 managedMqttClient
但如果你添加一种方法来设置默认值到定义工厂方法的 class ,你可以使工厂方法的参数可选.在工厂方法中,您可以回退到默认值,像这样。
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);
这些更改保留了原始调用签名,因此它们不会破坏任何现有代码。