具有异常日志记录的Serilog其他属性

时间:2020-07-08 08:02:37

标签: asp.net-core serilog

我正在使用带有ASP Net Core 3的serilog

它是自动设置和记录异常的-因此我没有错误处理可以记录错误。

我试图向记录的项目添加额外的上下文属性,并添加了中间件来记录这些项目。

LogContext.PushProperty("Email", email);
LogContext.PushProperty("Url", url);

如果我手动登录自己,但是在发生错误时自动添加的任何日志都没有添加这些项目,则会添加这些内容。

有什么想法吗?

注意:我已经读过... https://blog.datalust.co/smart-logging-middleware-for-asp-net-core/ 这是我发现的最能解决该问题的方法,但这会捕获异常并手动对其进行记录,如果这是唯一的解决方法,那真是遗憾。

1 个答案:

答案 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