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