Есть ли способ всегда деструктурировать определенный тип в 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, что я всегда хочу их деструктурировать?

0 ответов

Другие вопросы по тегам