首页 > 解决方案 > 如何强制对枚举进行 Serilog 标记

问题描述

我正在使用 Serilog 将我们的 log4net 记录器替换为结构化日志记录。我想使用 Enum 在代码中强制执行标记,但我在执行此操作时遇到了一些困难。

现在我的日志看起来像这样:

logger.ErrorFormat("Proxy Logic for the Item {Item} failed. Swallow exception", Item); 

ErrorFormat签名是

void ErrorFormat(string format, params object[] args);

但我不知道如何替换ItemLogTags.TagA. 当 TagA 是一个 Enum 时,它将为我提供为我的标记强制执行统一标准的方法。

所以它看起来像:

public enum LogTags
{
TagA,
...
}
public class Foo
{
     public void DoError()
     {
     logger.ErrorFormat("Proxy Logic for the Item {@LogTags.TagA} failed. Swallow exception", Item);
     }
}     

实现此类目标的最佳实践是什么?

标签: c#enumsserilog

解决方案


Serilog 中的属性名称需要是简单的、不带点的标识符,因此类似的名称Enum.LogTags.Item不能直接使用。

如果一个简单的名称不合适,您可以使用类似下面的模式强制这种嵌套:

logger.ErrorFormat(
  "Proxy Logic for the Item {@Enum} failed. Swallow exception",
  new { LogTags = new { Item }});

推荐阅读