如何使用 Serilog 2 记录 Exception.data 键/值?

How to log Exception.data key / values with Serilog 2?

我们的旧日志记录框架 (.NET 4.5) 将遍历 Exception.data 并记录每个 Exception.data 键值。记录与当前异常相关的上下文道具很好。有没有办法配置 Serilog 来记录 Exception.data 键值?

序列号 2

这是 Serilog 的等效代码:

public class ExceptionDataEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        if (logEvent.Exception == null ||
            logEvent.Exception.Data == null ||
            logEvent.Exception.Data.Count == 0) return;

        var dataDictionary = logEvent.Exception.Data
            .Cast<DictionaryEntry>()
            .Where(e => e.Key is string)
            .ToDictionary(e => (string)e.Key, e => e.Value);

        var property = propertyFactory.CreateProperty("ExceptionData", dataDictionary, destructureObjects: true);

        logEvent.AddPropertyIfAbsent(property);
    }
}

您可以在 this Gist 中找到带有配置的完整程序。

一个更复杂和灵活的选择是使用 Serilog.Exceptions 程序包,它对许多常见的异常类型具有智能。