Есть ли способ всегда деструктурировать определенный тип в Serilog
Допустим, у меня есть типаж
T
, который передается в функции serilog, например
Log.Information("Found object {Obj}", @object);
В моем случае я использую делегатов, у которых по умолчанию
.ToString()
который печатает имя типа: "System.Action". Для меня это бесполезно, поэтому я создал политику деструктуризации, чтобы сделать ее более полезной:
using Serilog.Core;
using Serilog.Events;
using System;
using System.Diagnostics;
namespace Core.Logging
{
public sealed class DelegateDestructuringPolicy : IDestructuringPolicy
{
/// <inheritdoc />
public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result)
{
if (value is Delegate del)
{
result = propertyValueFactory.CreatePropertyValue(FormatDelegateAsString(del));
return true;
}
result = null;
return false;
}
public static string FormatDelegateAsString(Delegate del)
{
ResolvedMethod resolvedMethod = EnhancedStackTrace.GetMethodDisplayString(del.Method);
return resolvedMethod.ToString();
}
}
}
Я добавил это в свой регистратор, используя
.Destructure.With<DelegateDestructuringPolicy>()
, но если я не деструктурирую объект вручную,
"{@Delegate}"
, он использует значение по умолчанию
ToString()
реализация:
public void Test()
{
Log.Information<Action>("Plain: {Method}", Test); // "Plain: System.Action"
Log.Information<Action>("ForceStr: {$Method}", Test); // "ForceStr: System.Action"
Log.Information<Action>("ForceDest: {@Method}", Test);// "ForceDest: void Testing.TestBehaviour.Test()"
}
Есть ли способ либо деструктурировать объекты до того, как они будут преобразованы в строку, либо сообщить serilog, что я всегда хочу их деструктурировать?