How to get an enriched property in the output message when using Serilog

∥☆過路亽.° 提交于 2019-12-10 04:34:07

问题


I'm trying to output an enriched property into the rendered message using 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);

The first log statement outputs:

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

The second log statement outputs:

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

I would expect them both to output the same information, just in a different order as defined by the message template. But as you can see, if you don't put the enriched property last, it is taken over by the provided object to be logged and the second template property is ignored. Is there a way to do this?


回答1:


Output templates are the way to achieve this, i.e.:

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

This will print the value of the Site property along with every message; e.g.:

Log.Information("Hello");

Prints:

19:40 [Information] Dan Local: Hello



回答2:


In case anyone who stumbles across this is curious about how to output all the available context properties, you can use {Properties} in the output string.

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

Prints:

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


来源:https://stackoverflow.com/questions/25385664/how-to-get-an-enriched-property-in-the-output-message-when-using-serilog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!