我想创建一个合同,强制在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
,这是一个字符串。
答案 0 :(得分:2)
通过消息模板执行此操作似乎很费力;你可以通过另外一种方法捎带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
类,您可以尝试使用扩展方法:
public static ILogger ForEvent(this ILogger log, EventItem item, EventFacility facility)
{
return log.ForContext("Event", item, true).ForContext("Facility", facility, true);
}