Add custom properties to Serilog

Marius Schulz picture Marius Schulz · Jan 11, 2015 · Viewed 16.1k times · Source

I'm using Serilog with an MS SQL Server sink in my application. Let's assume I have defined the following class ...

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }

  public DateTime BirthDate { get; set; }
  // ... more properties
}

... and created an instance:

var person = new Person
{
    FirstName = "John",
    LastName = "Doe",
    BirthDate = DateTime.UtcNow.AddYears(-25)
};

I have placed the following log call in my code:

Log.Information("New user: {FirstName:l} {LastName:l}",
    person.FirstName, person.LastName);

Is it possible to also log the BirthDate property without adding it to the message template so that it's rendered within the Properties XML column? I'd like to output it later in a details view of my application's log viewer.

I'm basically looking for a behavior similar to the object destructuring, but without printing the flat object as part of the log message.

Answer

Nicholas Blumhardt picture Nicholas Blumhardt · Jan 11, 2015

This is as simple as:

Log.ForContext("BirthDate", person.BirthDate)
   .Information("New user: {FirstName:l} {LastName:l}",
                           person.FirstName, person.LastName);