向 Serilog 添加自定义属性
Add custom properties to Serilog
我在我的应用程序中将 Serilog 与 MS SQL 服务器接收器一起使用。假设我定义了以下 class ...
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
// ... more properties
}
...并创建了一个实例:
var person = new Person
{
FirstName = "John",
LastName = "Doe",
BirthDate = DateTime.UtcNow.AddYears(-25)
};
我在我的代码中放置了以下日志调用:
Log.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
是否可以同时记录 BirthDate
属性 而不将其添加到消息模板 以便它在 Properties
中呈现XML栏目?我想稍后在我的应用程序日志查看器的详细视图中输出它。
我基本上是在寻找类似于对象解构的行为,但没有将平面对象打印为日志消息的一部分。
这很简单:
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
您实际上可以通过几种不同的方式来做到这一点。在您的情况下,第一种方法可能是最好的:
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
但你也可以在其他场景下使用LogContext
:
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);
}
或者,如果你想记录一个 "constant" 属性,你可以这样添加:
Log.Logger = new LoggerConfiguration()
// Enrich all log entries with property
.Enrich.WithProperty("Application", "My Application");
有关详细信息,请参阅 Context and correlation – structured logging concepts in .NET (5)。
如果您使用的是通用 Microsoft ILogger 接口,则可以使用 BeginScope;
using (_logger.BeginScope(new Dictionary<string, object> { { "LogEventType", logEventType }, { "UserName", userName } }))
{
_logger.LogInformation(message, args);
}
此处讨论; https://blog.rsuter.com/logging-with-ilogger-recommendations-and-best-practices/
我在我的应用程序中将 Serilog 与 MS SQL 服务器接收器一起使用。假设我定义了以下 class ...
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
// ... more properties
}
...并创建了一个实例:
var person = new Person
{
FirstName = "John",
LastName = "Doe",
BirthDate = DateTime.UtcNow.AddYears(-25)
};
我在我的代码中放置了以下日志调用:
Log.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
是否可以同时记录 BirthDate
属性 而不将其添加到消息模板 以便它在 Properties
中呈现XML栏目?我想稍后在我的应用程序日志查看器的详细视图中输出它。
我基本上是在寻找类似于对象解构的行为,但没有将平面对象打印为日志消息的一部分。
这很简单:
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
您实际上可以通过几种不同的方式来做到这一点。在您的情况下,第一种方法可能是最好的:
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
但你也可以在其他场景下使用LogContext
:
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);
}
或者,如果你想记录一个 "constant" 属性,你可以这样添加:
Log.Logger = new LoggerConfiguration()
// Enrich all log entries with property
.Enrich.WithProperty("Application", "My Application");
有关详细信息,请参阅 Context and correlation – structured logging concepts in .NET (5)。
如果您使用的是通用 Microsoft ILogger 接口,则可以使用 BeginScope;
using (_logger.BeginScope(new Dictionary<string, object> { { "LogEventType", logEventType }, { "UserName", userName } }))
{
_logger.LogInformation(message, args);
}
此处讨论; https://blog.rsuter.com/logging-with-ilogger-recommendations-and-best-practices/