如何使用 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 DataSet
、DataTable
等类型应该解构为标量值。例如
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;
}
}
我正在使用 Serilog 实现 AOP 以记录所有方法调用和参数值
这是我的代码:
_logger.ForContext(targetType).Information("INVOKE {@guid} {@MethodName} with parameters {@arg}", guid, invocation.Method.Name, invocation.Arguments);
但是,有些参数类型不能记录为DataTable、DataSet、Image、byte[] ...
如何在 Serilog 中忽略这些类型?
一个简单的解决方案是预先告诉 Serilog DataSet
、DataTable
等类型应该解构为标量值。例如
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;
}
}