使用Serilog时如何在输出消息中获得丰富的属性

我正在尝试使用Serilog将丰富的属性输出到渲染的消息中:

private static Tester GetTester() { return new Tester {Count = 7, Name = "Redmond"}; } Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("Site", "Dan Local") .WriteTo .ColoredConsole() .CreateLogger(); var tester = GetTester(); Log.Verbose("{Site} - This is verbose {@tester}", tester); Log.Verbose("This is verbose {@tester} - {Site}", tester); 

第一个日志语句输出:

 2014-08-19 10:02:25 [Verbose] "SeriLogTest.Tester" - This is verbose {@tester} 

第二个日志语句输出:

 2014-08-19 10:02:25 [Verbose] This is verbose Tester { Count: 7, Name: "Redmond" } - "Dan Local" 

我希望他们两者输出相同的信息,只是按照消息模板定义的不同顺序。 但正如您所看到的,如果您没有将最丰富的属性放在最后,它将被提供的对象接管以进行记录,并忽略第二个模板属性。 有没有办法做到这一点?

输出模板是实现此目的的方法,即:

  .WriteTo.ColoredConsole( outputTemplate: "{Timestamp:HH:mm} [{Level}] {Site}: {Message}{NewLine}{Exception}") 

这将打印Site属性的值以及每条消息; 例如:

 Log.Information("Hello"); 

打印:

 19:40 [Information] Dan Local: Hello 

如果遇到这种情况的人对如何输出所有可用的上下文属性感到好奇,可以在输出字符串中使用{Properties}

 .WriteTo.ColoredConsole( outputTemplate: "{Timestamp:HH:mm} [{Level}] {Properties}: {Message}{NewLine}{Exception}") 

打印:

 19:40 [Information] {Site="Dan Local"}: Hello