【问题标题】:How to ignore log property base on class type with Serilog如何使用 Serilog 忽略基于类类型的日志属性
【发布时间】:2021-03-01 21:58:11
【问题描述】:

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

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

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

【问题讨论】:

  • 要么在传递数组之前将它们从参数中过滤掉,要么编写可以将它们转换为对日志有意义的东西的自定义解构器

标签: c# logging .net-core aop serilog


【解决方案1】:

一个简单的解决方案是预先告诉 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;
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多