我尝试使用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"
我希望他们两者输出相同的信息,只是按照消息模板定义的不同顺序。但正如您所看到的,如果您不将最后的富集属性放在最后,则会被提供的对象接管以进行记录,并忽略第二个模板属性。有没有办法做到这一点?
答案 0 :(得分:6)
输出模板是实现这一目标的方法,即:
.WriteTo.ColoredConsole(
outputTemplate: "{Timestamp:HH:mm} [{Level}] {Site}: {Message}{NewLine}{Exception}")
这将打印Site
属性的值以及每条消息; e.g:
Log.Information("Hello");
打印:
19:40 [Information] Dan Local: Hello
答案 1 :(得分:3)
如果遇到这种情况的人对如何输出所有可用的上下文属性感到好奇,可以在输出字符串中使用{Properties}
。
.WriteTo.ColoredConsole(
outputTemplate: "{Timestamp:HH:mm} [{Level}] {Properties}: {Message}{NewLine}{Exception}")
打印:
19:40 [Information] {Site="Dan Local"}: Hello