gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:07:14 26 4
gpt4 key购买 nike

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

最佳答案

通过message template来做,好像很费力;你可以通过附加方法搭载 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);
}

关于c# - 强制使用 Serilog 中的特定参数(或通常在外部函数中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47494230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com