Serilog序列化领域
问题描述:
如果我有下面的类Serilog序列化领域
public class Customer
{
public string Name;
}
,然后在Serilog以下日志命令
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
var item = new Customer();
item.Name = "John";
Serilog.Log.Information("Customer {@item}", item);
日志只是显示在序列作为
Customer {}
如果我将名称字段更改为它的工作属性,但在此阶段我不希望这样做。有没有办法解决它?
答
要只为一个类型(推荐)做到这一点,你可以使用:
.Destructure.ByTransforming<Customer>(c => new { c.Name })
如果要包括所有类型的公共领域,或那些符合某种条件下,你可以插入政策做:
class IncludePublicFieldsPolicy : IDestructuringPolicy
{
public bool TryDestructure(
object value,
ILogEventPropertyValueFactory propertyValueFactory,
out LogEventPropertyValue result)
{
if (!(value is SomeBaseType))
{
result = null;
return false;
}
var fieldsWithValues = value.GetType().GetTypeInfo().DeclaredFields
.Where(f => f.IsPublic)
.Select(f => new LogEventProperty(f.Name,
propertyValueFactory.CreatePropertyValue(f.GetValue(value))));
result = new StructureValue(fieldsWithValues);
return true;
}
}
的例子作用域下来看看仅从SomeBaseType
派生的对象。
您可以用插:
.Destructure.With<IncludePublicFieldsPolicy>()
(我认为这是可能需要一些调整,但应该是一个很好的起点。)
+1
作品完美,谢谢。 – Craig
一种选择可能是使用了''解构''LoggerConfiguration''上的配置对象,如下所述:https://github.com/serilog/serilog/wiki/Structured-Data#customizing-the-stored-data –
当'Name'属性时它工作吗? – ASpirin
是的,如果我让Name成为它的作品。 – Craig