我正在使用带有ASP Net Core 3的serilog
它是自动设置和记录异常的-因此我没有错误处理可以记录错误。
我试图向记录的项目添加额外的上下文属性,并添加了中间件来记录这些项目。
LogContext.PushProperty("Email", email);
LogContext.PushProperty("Url", url);
如果我手动登录自己,但是在发生错误时自动添加的任何日志都没有添加这些项目,则会添加这些内容。
有什么想法吗?
注意:我已经读过... https://blog.datalust.co/smart-logging-middleware-for-asp-net-core/ 这是我发现的最能解决该问题的方法,但这会捕获异常并手动对其进行记录,如果这是唯一的解决方法,那真是遗憾。
答案 0 :(得分:0)
首先,LogContext是一个堆栈;必须通过处理从PushProperty()
返回的对象来弹出被压入堆栈的属性:
using (LogContext.PushProperty("Email", email))
using (LogContext.PushProperty("Url", url)){
// middleware code
...
}
否则,该行为可能是不确定的。
但是发生错误时自动添加的所有日志均未添加这些项目
我假设错误记录发生在范围之外,而这些属性不存在。在这种情况下,请尝试ThrowContextEnricher,以使用引发异常的原始上下文中的属性来丰富异常日志。
// call it once on app startup
ThrowContextEnricher.EnsureInitialized();
...
// then each throwing will capture context,
// so you can enrich log in exception handler:
catch (Exception ex)
{
using (LogContext.Push(new ThrowContextEnricher()))
{
Log.Error(ex, "Exception!");
}
}
或者直接在LoggerConfiguration上全局注册ThrowContextEnricher
(在这种情况下,不需要ThrowContextEnricher.EnsureInitialized()
)。因此,每个异常日志都将得到充实:
Log.Logger = new LoggerConfiguration()
.Enrich.With<ThrowContextEnricher>()
.Enrich.FromLogContext()
...
.CreateLogger();
免责声明:我是该库的作者,并且还留下了一个示例in this answer。