9

我正在尝试使用 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"

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

4

2 回答 2

11

输出模板是实现这一目标的方法,即:

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

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

Log.Information("Hello");

印刷:

19:40 [Information] Dan Local: Hello
于 2014-08-21T09:16:38.520 回答
10

如果任何偶然发现这一点的人对如何输出所有可用的上下文属性感到好奇,您可以{Properties}在输出字符串中使用。

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

印刷:

19:40 [Information] {Site="Dan Local"}: Hello
于 2018-02-05T20:25:48.130 回答