如何添加不属于消息模板的命名 属性?

How can I add a named property that is not part of the message template?

在某些情况下,我想将上下文信息添加到消息中(例如当前经过身份验证的用户),而不必将其包含在消息中模板.

我想完成这个:

logger.Information("Doing stuff {Foo} with the thing {Bar}. {User}", foo, bar, user)

但模板中没有 {User}

我已经知道 LogContext 但在仅向一个事件添加上下文信息时,这似乎有点过分了。

我也知道我可以使用低级 API logger.Write(LogEvent evnt) 来实际控制包含哪些属性,但是对于我想要完成的事情来说,这似乎有点太多代码了。

我很确定有一个非常明显的简短而优雅的方法,但我还没有找到:)

更新:

我后来才发现这个问题或多或少相似:

我可以自己解决!

您可以在一次调用 .LogXXX() 方法之一时使用流畅的方法 .ForContext(propertyName, propertyValue)

例如:

logger.ForContext("User", user)
      .Information("Doing stuff {Foo} with the thing {Bar}", foo, bar)

添加到事件中的 属性 仅适用于该事件,并且在下次调用 logger.LogXXX() 方法时不再存在

更新

Nicholas Blumhardt 的文章解释得很好: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/