如何使用 Serilog 根据 class 类型忽略日志 属性

How to ignore log property base on class type with Serilog

我正在使用 Serilog 实现 AOP 以记录所有方法调用和参数值
这是我的代码:

_logger.ForContext(targetType).Information("INVOKE {@guid} {@MethodName} with parameters {@arg}", guid, invocation.Method.Name, invocation.Arguments);

但是,有些参数类型不能记录为DataTable、DataSet、Image、byte[] ...
如何在 Serilog 中忽略这些类型?

一个简单的解决方案是预先告诉 Serilog DataSetDataTable 等类型应该解构为标量值。例如

Log.Logger = new LoggerConfiguration()
    .Destructure.AsScalar(typeof(DataSet))
    .Destructure.AsScalar(typeof(DataTable))
    // ...
    .CreateLogger();

您也可以使用 .Destructure.ByTransforming.Destructure.ByTransformingWhere

另一种解决方案是创建自定义 destructuring policy,您可以在其中决定如何解构不同的类型:

Log.Logger = new LoggerConfiguration()
    .Destructure.With<IgnoreSomeTypesDestructuringPolicy>()
    // ...
    .CreateLogger();

public class IgnoreSomeTypesDestructuringPolicy : IDestructuringPolicy
{
    public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result)
    {
        if (value is DataTable || value is DataSet /* ... */)
        {
            result = new ScalarValue(value.ToString());
            return true;
        }

        result = null;
        return false;
    }
}