8

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

我想做到这一点:

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

但没有{User}在模板中。

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

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

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

更新 :

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

4

2 回答 2

8

我可以自己想办法!

.ForContext(propertyName, propertyValue)您可以在一次调用其中一种方法时使用 fluent.LogXXX()方法。

例如 :

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

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

更新

Nicholas Blumhardt 的文章很好地解释了它:上下文和相关性 - .NET 中的结构化日志记录概念 (5)

于 2015-06-04T08:46:19.253 回答
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/

于 2020-09-29T19:08:19.193 回答