【问题标题】:Serilog Additional Properties with Exception logging带有异常日志记录的 Serilog 附加属性
【发布时间】:2020-10-28 14:11:30
【问题描述】:

我正在使用带有 asp net core 3 的 serilog

它是自动设置和记录异常 - 所以我没有错误处理来记录错误。

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

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

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

有什么想法吗?

注意:我读过这个... https://blog.datalust.co/smart-logging-middleware-for-asp-net-core/ 这是我发现的最接近该问题的解决方法,但这会捕获异常并手动记录它,如果这是唯一可以完成的方法,那就太可惜了。

【问题讨论】:

  • 类似的是,但希望我添加了更多细节。如果我发现错误并自己记录它,我的代码就可以工作 - 如果我记录信息或任何其他类型的日志,它就可以工作。什么不起作用是它没有为它自己记录的错误添加上下文项。正如我所读到的,它在不同的“上下文”或“从堆栈中弹出”,但这没有帮助,您会认为这是错误记录的基本要求吗?
  • 绝对不是说这是一个重复(首先,这个问题被更直接地提出)。 LogContext.PushProperty / Enrich.FromLogContext 肯定会在 using 和/或堆叠性的假设下工作;当进行 Logging 调用时(并且只能)捕获这些值(这要求它仍然在相同的上下文中,而不是展开所有内容并完成拆卸)。我还没有深入研究使用 asp.net 核心可以做的事情来存储上下文,以便它可以从这样的内部上下文传输到异常处理程序中间件,但对我来说那不是 Serilog 部门。
  • 好的,所以我实施的是我猜的唯一解决方案。我有一个中间件类,它包装执行,捕获错误并手动记录它们,然后不重新抛出,所以不会调用自动错误记录)对我来说这是一种耻辱,因为事情看起来真的很好/有用,但这似乎对我来说就像一个黑客/解决方法
  • 嗯,我很确定 DiagnosticContext 或其他东西可以将上下文从请求处理流向全局请求日志记录和全局异常日志记录。我仍然希望你能得到一个正确的答案。也不确定你是否知道most recent overview article by Nick covers ASP.NET Core 3

标签: asp.net-core serilog


【解决方案1】:

起初,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多