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

tsi*_*lar 4 serilog

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

我想做到这一点:

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

{User}模板中没有。

我已经知道了,LogContext但是将上下文信息添加到一个事件中似乎太过分了。

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

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

更新:

之后我才发现这个问题或多或少是相似的:向Serilog添加自定义属性

Jos*_*osh 15

如果您使用通用的 Microsoft ILogger,则可以使用 BeginScope;

using (_logger.BeginScope(new Dictionary<string, object> { { "LogEventType", logEventType }, { "UserName",  userName } }))
{
    _logger.LogInformation(message, args);
}
Run Code Online (Sandbox Code Playgroud)

这是在这里讨论的;https://blog.rsuter.com/logging-with-ilogger-recommendations-and-best-practices/

  • 不知道为什么这没有得到更多的支持。我更喜欢使用 ILogger 接口,而不是与 Serilog 紧密耦合(尽管 Serilog 很棒)。 (3认同)

tsi*_*lar 5

我可以自己弄清楚!

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

例如 :

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

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

更新

Nicholas Blumhardt的文章对此进行了很好的解释:上下文和关联 -.NET中的结构化日志记录概念(5)