2017-09-11 74 views
2

如果我有下面的类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 {} 

如果我将名称字段更改为它的工作属性,但在此阶段我不希望这样做。有没有办法解决它?

+0

一种选择可能是使用了''解构''LoggerConfiguration''上的配置对象,如下所述:https://github.com/serilog/serilog/wiki/Structured-Data#customizing-the-stored-data –

+0

当'Name'属性时它工作吗? – ASpirin

+0

是的,如果我让Name成为它的作品。 – Craig

回答

2

要只为一个类型(推荐)做到这一点,你可以使用:

.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