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

时间:2015-06-04 07:17:49

标签: serilog

在某些情况下,我希望向消息添加上下文信息(例如,当前经过身份验证的用户),,而不必将其包含在消息模板中。< / p>

我想做到这一点:

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

但模板中没有{User}

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

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

我很确定有一种超级明显的简短方式,但我还没有找到它:)

更新:

我之后才发现这个问题或多或少相似:Add custom properties to Serilog

2 个答案:

答案 0 :(得分:4)

我可以自己解决这个问题!

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

例如:

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)

答案 1 :(得分:0)

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