如何使用 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 程序包,它对许多常见的异常类型具有智能。
我们的旧日志记录框架 (.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 程序包,它对许多常见的异常类型具有智能。