36

我在我的应用程序中使用带有 MS SQL Server 接收器的 Serilog。假设我已经定义了以下类...

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的情况下记录该属性,以便在XML 列中呈现它?我想稍后在我的应用程序日志查看器的详细信息视图中输出它。Properties

我基本上是在寻找类似于对象解构的行为,但没有将平面对象打印为日志消息的一部分。

4

3 回答 3

43

这很简单:

Log.ForContext("BirthDate", person.BirthDate)
   .Information("New user: {FirstName:l} {LastName:l}",
                           person.FirstName, person.LastName);
于 2015-01-11T21:03:33.973 回答
26

您实际上可以通过几种不同的方式做到这一点。在您的情况下,第一种方法可能是最好的:

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);
}

或者,如果您想记录一个“常量”属性,您可以像这样添加它:

Log.Logger = new LoggerConfiguration()
    // Enrich all log entries with property
    .Enrich.WithProperty("Application", "My Application");

有关详细信息,请参阅上下文和相关性 - .NET (5)中的结构化日志记录概念。

于 2019-11-05T06:24:59.003 回答
8

如果您使用的是通用 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/

于 2020-09-29T19:11:26.260 回答