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.
This is as simple as:
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
You can actually do this in a few different ways. In your case, the first way is probably the best:
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
But you can also use the LogContext
in other scenarios:
Log.Logger = new LoggerConfiguration()
// Enrich all log entries with properties from LogContext
.Enrich.FromLogContext();
using (LogContext.PushProperty("BirthDate", person.BirthDate))
{
Log.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
}
Or, in the case where you want to log a "constant" property, you can add it like this:
Log.Logger = new LoggerConfiguration()
// Enrich all log entries with property
.Enrich.WithProperty("Application", "My Application");
See Context and correlation – structured logging concepts in .NET (5) for more information.
If you're using the generic Microsoft ILogger interface you can use BeginScope;
using (_logger.BeginScope(new Dictionary<string, object> { { "LogEventType", logEventType }, { "UserName", userName } }))
{
_logger.LogInformation(message, args);
}
This is discussed here; https://blog.rsuter.com/logging-with-ilogger-recommendations-and-best-practices/
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.