强制使用 Serilog 中的特定参数(或通常在外部函数中)
Enforce using specific parameters in Serilog (or generally in an external function)
我想创建一个合约,强制在 Serilog 日志记录功能上使用特定的参数模板。
有没有办法不用我自己封装函数(每个日志记录级别都需要封装)来做到这一点?
我有一个名为 EventLog 的命名空间,它包含事件类型、设施等。
我想在记录时强制使用该命名空间中的事件类型和设施。
而不是:
void _LogLevel_<T0, T1, T2>(string messageTemplate, T0 propertyValue0, T1 propertyValue1, T2 propertyValue2);
我想强制执行:
void _LogLevel_<EventLog.EventItem, EventLog.Facility, T0, T1>(string messageTemplate, EventLog.EventItem EventType, EventLog.Facility Facility, T0 propertyValue0, T1 propertyValue1, ...);
假设如果未指定这两个参数,代码将无法编译,并且前两个对象将被序列化为任何泛型 T0, T1, ...
将在 Serilog 中。
这是为了确保在调用日志功能时,始终添加给定的参数。
另一个问题是 Serilog 有它自己的 DSL,我不能强制将 {@Event}, {@Facility}
添加到 messageTemplate
,这是一个字符串。
通过消息模板来做,好像很费力;你可以通过附加方法搭载 Serilog 的 ForContext()
来实现你想要的:
public static ILogger ForEvent(EventItem item, EventFacility facility)
{
return Log.ForContext("Event", item, true).ForContext("Facility", facility, true);
}
你会这样称呼 MyLog.ForEvent(e, f).Information("Hello!")
。
如果您使用的是 ILogger
,而不是上述示例使用的静态 Log
class,您可以尝试扩展方法:
public static ILogger ForEvent(this ILogger log, EventItem item, EventFacility facility)
{
return log.ForContext("Event", item, true).ForContext("Facility", facility, true);
}
我想创建一个合约,强制在 Serilog 日志记录功能上使用特定的参数模板。
有没有办法不用我自己封装函数(每个日志记录级别都需要封装)来做到这一点?
我有一个名为 EventLog 的命名空间,它包含事件类型、设施等。 我想在记录时强制使用该命名空间中的事件类型和设施。
而不是:
void _LogLevel_<T0, T1, T2>(string messageTemplate, T0 propertyValue0, T1 propertyValue1, T2 propertyValue2);
我想强制执行:
void _LogLevel_<EventLog.EventItem, EventLog.Facility, T0, T1>(string messageTemplate, EventLog.EventItem EventType, EventLog.Facility Facility, T0 propertyValue0, T1 propertyValue1, ...);
假设如果未指定这两个参数,代码将无法编译,并且前两个对象将被序列化为任何泛型 T0, T1, ...
将在 Serilog 中。
这是为了确保在调用日志功能时,始终添加给定的参数。
另一个问题是 Serilog 有它自己的 DSL,我不能强制将 {@Event}, {@Facility}
添加到 messageTemplate
,这是一个字符串。
通过消息模板来做,好像很费力;你可以通过附加方法搭载 Serilog 的 ForContext()
来实现你想要的:
public static ILogger ForEvent(EventItem item, EventFacility facility)
{
return Log.ForContext("Event", item, true).ForContext("Facility", facility, true);
}
你会这样称呼 MyLog.ForEvent(e, f).Information("Hello!")
。
如果您使用的是 ILogger
,而不是上述示例使用的静态 Log
class,您可以尝试扩展方法:
public static ILogger ForEvent(this ILogger log, EventItem item, EventFacility facility)
{
return log.ForContext("Event", item, true).ForContext("Facility", facility, true);
}