TagProvider
LogProperties\] 与 \[LogPropertyIgnore\] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱。
您可能不希望因日志记录问题而使您的域模型变得混乱。对于这种情况,可以使用\[TagProvider\]属性来丰富日志。
我们仍然使用前面用的Network实体,这次它不再使用\[LogPropertyIgnore\]属性:
```
public class NetWorkInfo
{
public string IPAddress { get; set; }
public int Port { get; set; }
}
```
相反,我们定义了一个专用的"TagProvider"实现。
不需要实现接口或任何类,只需要正确的方法格式。
下面是我们给Network对象的标签提供程序,我们只记录字段IPAddres字段,如下所示:
```
internal static class NetWorkInfoTagProvider
{
// 👇 Has the required signature 'void RecordTags(ITagCollector, T)'
public static void RecordTags(ITagCollector collector, NetWorkInfo network)
{
// You can add aribrtrary objects to be logged.
// You provide a key (first arg) and a value.
collector.Add(nameof(NetWorkInfo.IPAddress), network.IPAddress);
}
}
```
定义标签提供程序后,我们现在可以在日志记录方法中使用它。
将属性替换\[LogProperties\]为\[TagProvider\]如下所示的属性:
```
public static partial class Log
{
[LoggerMessage(
EventId = 0,
Level = LogLevel.Error,
Message = "Can not open SQL connection {err}")]
public static partial void CouldNotOpenConnection(this ILogger logger, string err,
[TagProvider(typeof(NetWorkInfoTagProvider), nameof(NetWorkInfoTagProvider.RecordTags))] NetWorkInfo netWork);
}
```
按正常方式调用即可,可以看到Network.IPAddress已经记录到日志的State属性中。
```
private static async Task Main(string[] args)
{
using ILoggerFactory loggerFactory = LoggerFactory.Create(
builder =>
builder.AddJsonConsole(
options =>
options.JsonWriterOptions = new JsonWriterOptions()
{
Indented = true
}));
ILogger logger = loggerFactory.CreateLogger("Program");
logger.CouldNotOpenConnection("network err", new NetWorkInfo { IPAddress = "123.1.1", Port = 7777 });
}
```

**Enricher**
Microsoft.Extensions.Telemetry包可以像Serilog一样丰富日志。首先添加Nuget包
```