在Serilog中强制使用特定参数(或通常在外部函数中)

时间:2017-11-26 08:20:26

标签: c# serilog

我想创建一个合同,强制在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,这是一个字符串。

1 个答案:

答案 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);
}