C# 如何使用Serilog忽略基于类类型的日志属性

C# 如何使用Serilog忽略基于类类型的日志属性,c#,logging,.net-core,aop,serilog,C#,Logging,.net Core,Aop,Serilog,我正在使用Serilog实现AOP,以记录所有方法调用和参数值 这是我的密码: _logger.ForContext(targetType).Information("INVOKE {@guid} {@MethodName} with parameters {@arg}", guid, invocation.Method.Name, invocation.Arguments); 但是,某些参数类型不能记录为DataTable、DataSet、Image、byte[]… 如何

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

_logger.ForContext(targetType).Information("INVOKE {@guid} {@MethodName} with parameters {@arg}", guid, invocation.Method.Name, invocation.Arguments);
但是,某些参数类型不能记录为DataTable、DataSet、Image、byte[]…

如何在Serilog中忽略这些类型?

一个简单的解决方案是预先告诉Serilog,诸如
数据集
数据表
等类型应该被分解为标量值。例如

Log.Logger = new LoggerConfiguration()
    .Destructure.AsScalar(typeof(DataSet))
    .Destructure.AsScalar(typeof(DataTable))
    // ...
    .CreateLogger();
您还可以使用
.Destructure.ByTransforming
.Destructure.ByTransformingWhere

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

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;
    }
}
Log.Logger=new LoggerConfiguration()
.Destructure.With()
// ...
.CreateLogger();
公共类IgnoreSomeTypesDestructuringPolicy:IDestructuringPolicy
{
public bool TrydStructure(对象值、ILogEventPropertyValueFactory属性值工厂、out LogEventPropertyValueResult)
{
如果(值为DataTable | |值为DataSet/*…*/)
{
结果=新的ScalarValue(value.ToString());
返回true;
}
结果=空;
返回false;
}
}

一个简单的解决方案是预先告诉Serilog,诸如
数据集
数据表
等类型应该被分解为标量值。例如

Log.Logger = new LoggerConfiguration()
    .Destructure.AsScalar(typeof(DataSet))
    .Destructure.AsScalar(typeof(DataTable))
    // ...
    .CreateLogger();
您还可以使用
.Destructure.ByTransforming
.Destructure.ByTransformingWhere

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

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;
    }
}
Log.Logger=new LoggerConfiguration()
.Destructure.With()
// ...
.CreateLogger();
公共类IgnoreSomeTypesDestructuringPolicy:IDestructuringPolicy
{
public bool TrydStructure(对象值、ILogEventPropertyValueFactory属性值工厂、out LogEventPropertyValueResult)
{
如果(值为DataTable | |值为DataSet/*…*/)
{
结果=新的ScalarValue(value.ToString());
返回true;
}
结果=空;
返回false;
}
}

在传递数组之前将其从参数中筛选出来,或者编写可将其转换为对日志有意义的自定义析构函数在传递数组之前将其从参数中筛选出来,或者编写可将其转换为对日志有意义的自定义析构函数