Serilog Logcontext 属性在异常处理程序之后消失

2023-12-07

在我的网站中,我正在集成 Serilog 以将错误记录到自定义接收器。日志记录通过 LogContext 进行了丰富,其中需要传递一些自定义属性。如果我使用 Log.Information() ,它会带着 LogEvent 中的属性到达我的接收器。所以这很有效。

主要目的是将日志系统与异常处理程序中间件结合起来。因此,在异常处理程序中,错误被捕获,该错误是从控制器方法抛出的。无论我将 _logger.Log() 放在异常处理程序中的任何位置,接收器中都没有可用的自定义属性。调试时,它在进入 Sink 之前传递了 LogContextFilter,但未找到过滤器的属性。

有人有什么想法吗?

Startup

Log.Logger = new LoggerConfiguration()
            .WriteTo.PasSink(new SerLogServiceClient.SerLogServiceClient(new SerLogServiceClientOptions()))
            .Enrich.FromLogContext()
            .CreateLogger();

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddMvcOptions(mo =>
        {
            mo.Filters.Add(typeof(LogContextFilter));
        });

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMiddleware<LogContextMiddleware>();
        app.UseErrorHandler(o =>
        {
            o.ExceptionHandlingPath = "/Home/Error";
            o.Context = ExceptionHandler.Context.MVC;
        });

        //app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(
                Path.Combine(Directory.GetCurrentDirectory(), "Content")),
            RequestPath = "/Content"
        });

        app.UseAuthentication();

        app.UseSession();
        //app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

日志上下文过滤器

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        using (LogContext.Push(
            new PropertyEnricher("UserCode", context.HttpContext.User.Claims.FirstOrDefault(s => s.ToString().StartsWith("UserCode"))?.Value),
            new PropertyEnricher("Test", "Will this go through?")))
        {
            await next.Invoke();
        }
    }

异常处理中间件

public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next.Invoke(context);
        }
        catch (HttpRequestException hex)
        {
            //check response naar reynaersexception??
            //deserialize naar re
            throw new NotSupportedException();  //als test
        }
        catch  (Exception ex)
        {

            if (context.Response.HasStarted)
            {
                throw ex;
            }

            _logger.LogError(ex.Message);

            var originalPath = context.Request.Path;
            try
            {
                if (_options.Context == Context.MVC)
                {
                    context.Response.Clear();
                    context.Response.StatusCode = 500;
                    context.Response.OnStarting(Callback, context.Response);

                    //set features
                    var exceptionHandlerFeature = new ReynaersExceptionHandlerFeature()
                    {
                        Error = ex,
                        Path = context.Request.Path.Value,
                    };
                    context.Features.Set<IExceptionHandlerFeature>(exceptionHandlerFeature);
                    context.Features.Set<IExceptionHandlerPathFeature>(exceptionHandlerFeature);

                    //continue lifecycle with updated context
                    if (_options.ExceptionHandlingPath.HasValue)
                    {
                        context.Request.Path = _options.ExceptionHandlingPath;
                    }

                    await _next.Invoke(context);
                }
            }
            catch (Exception ex2)
            {
                // Suppress secondary exceptions, re-throw the original.
                Log.Error(ex2.Message);
                context.Request.Path = originalPath;
                throw ex;
            }
        }
    }

发生这种情况是因为异常被记录在运行于外部的处理程序中using (LogContext.Push(..)),因此自定义属性已经从上下文中消失了。

...

// in mvc's OnActionExecutionAsync()
        using (LogContext.Push(
            new PropertyEnricher("UserCode", ".."),
            new PropertyEnricher("Test", "Will this go through?")))
        {
            await next.Invoke(); // code that throws
        }

...

// later in ExceptionHandlerMiddleware, no custom properties
_logger.LogError(ex.Message);

前段时间我研究了这个问题并写道抛出上下文丰富器.

该库从抛出异常的点捕获上下文。然后可以使用 ThrowContextEnricher 用原始上下文来丰富异常日志。

Log.Logger = new LoggerConfiguration()
    .Enrich.With<ThrowContextEnricher>()  // Adds enricher globally
    .Enrich.FromLogContext()
    .WriteTo
    ...
    .CreateLogger();
...


// in mvc's OnActionExecutionAsync()
// push your properties as normal
        using (LogContext.Push(
            new PropertyEnricher("UserCode", ".."),
            new PropertyEnricher("Test", "Will this go through?")))
        {
            await next.Invoke(); // code that throws
        }

...

// in exception handler
// properties get logged now
// notice the exception is passed too, not just message
_logger.LogError(ex, ex.Message);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Serilog Logcontext 属性在异常处理程序之后消失 的相关文章

随机推荐

  • ORM / 如何处理Domain对象和Persistent对象的对应关系?

    在应用程序中 至少有两种方法来处理域对象持久性和 ORM 使用某种 ORM xml 或注释 将域对象直接映射到持久性 Making 关注点分离如果您的域和持久模型 表列 之间存在大量阻抗不匹配 这意味着 域对象与持久性无关 并且存在一些到某
  • 每次打开项目时 Xcode 都会意外退出

    打开 xcode 后 当我打开当前项目时 它会显示类似 xcode 意外退出 的警告 并有 3 个选项 忽略 报告 和 重新打开 当我单击 重新打开 时 它将打开 xcode 窗口 然后再次自动关闭并显示相同的警告 为什么会发生这种情况 如
  • 如何实现多线程并行执行多个任务?

    我是线程编程的新手 我必须在并行和后台运行一些任务 以便主 UI 执行线程保持对用户操作的响应 并等待每一项任务完成 然后再继续进一步执行 就像是 foreach MyTask t in myTasks t DoSomethinginBac
  • 操作按钮和observeEvent

    我想要一个按钮来触发对预先指定的非反应变量的操作x 每次按下按钮时x lt x 1应予执行 为了检查是否正确完成 应显示结果 为了实现这个我尝试过observeEvent 但它只做了一次它应该做的事情 它如何正常工作 看起来rv仅在以下范围
  • 将 Git 存储库发布到 SVN

    我和我的小团队使用 Git 工作 较大的团队使用 Subversion 我想安排一个 cron 作业来发布我们当前的存储库HEAD每小时进入 SVN 存储库中的某个目录 我以为我已经弄清楚了 但我之前写下的食谱现在似乎不起作用 git cl
  • NSSearchPathForDirectoriesInDomains 麻烦(掉头发快)

    我很快就秃顶了 需要帮助 我正在编写一个需要访问目录的应用程序 我希望得到一种形式的路径 用户 我 库 应用程序支持 iPhone模拟器 用户 应用程序 6958D21C C94B 4843 9EF1 70406D0CA3A3 文档 然而我
  • 如何在firebase中保存用户分数并在Android studio中实时检索

    我正在创建一个应用程序 其中单击按钮时点会增加 并且这些点应保存到 firebase 中 我设法将这些数据保存到 firebase 中 但是 当我销毁我的应用程序并再次打开它时 点值显示相同 但 在单击按钮后 又从0开始 例如 每次点击按钮
  • 如何使用numpy python计算元素向量的数量

    例如 如果我有 a np array 1 1 4 1 4 3 1 我们可以看到 数字 1 出现了四次 数字 4 出现了两次 只有 3 次 我想要得到以下结果 array 4 4 2 4 2 1 4 正如您所看到的 每个单元格都被其元素的计数
  • 当项目悬停时显示列表

    我有这个样本 link show hover list categories max height inherit opacity 1 list categories list style type none padding 0px mar
  • 了解 python 中嵌套 lambda 函数的行为

    我正在尝试学习纯函数式编程 但这段代码让我感到困惑 尤其是第二行 我不明白价值如何2被传递给变量x 有人可以解释一下这个嵌套吗lambda行为 gt gt gt square func lambda x x 2 gt gt gt funct
  • 任务generateMetadataFileForReleasePublication使用任务androidSourcesJar的此输出,而不声明显式或隐式依赖项

    以下命令无法发布我的 Android 库 gradlew my sdk publish stacktrace 这是我看到的错误 Reason Task my sdk generateMetadataFileForReleasePublica
  • 理解 __get__ 和 __set__ 以及 Python 描述符

    I am trying了解 Python 的描述符是什么以及它们的用途 我理解它们是如何工作的 但我有疑问 考虑以下代码 class Celsius object def init self value 0 0 self value flo
  • 防止箭头键转到上一个/下一个单元格

    在 Visual Studio Code 中使用 Jupyter 笔记本 使用 Microsoft 的 Python 扩展 时 是否可以配置应用程序以防止箭头键退出当前单元格 基本上 当我使用箭头键在可编辑单元格 代码或降价 内移动时 我不
  • 如何检测操作系统或设备类型等系统信息

    我想知道的最重要的事情是设备类型 操作系统版本 是否有硬件键盘 也许还有屏幕分辨率 但如果您知道其他有用的调试信息 请添加它们 我找到了操作系统版本 string OS Version System getProperty os versi
  • 可能出现意外的参考比较

    我有以下代码给出警告 可能出现意外的参考比较 要进行值比较 请将左侧转换为类型 string if lblStatus Content ACTIVE Do stuff else Do other Stuff 我假设警告是因为lblStatu
  • 由于 mscordbi.dll 版本错误,托管调试不再起作用

    我正在尝试使用 Visual Studio 进行托管调试内存转储 但失败并显示以下错误消息 托管调试对此小型转储不可用 无法找到托管小型转储调试所需的库 mscordbi dll 版本 4 0 30319 0 尝试以下任一步骤后重新启动调试
  • 编译 K&R 示例时出现问题

    我在编译本书第 5 11 节中提供的示例程序时遇到问题 我删除了大部分代码 只留下了相关的内容 define MAXLINES 5000 char lineptr MAXLINES void qsort1 void lineptr int
  • :target 伪选择器和选项卡

    所以我想创建一个仅使用 CSS 的选项卡系统 到目前为止我所拥有的有效 但我不知道如何使一个选项卡默认可见 选项卡 section class tabs ul li a href tab1 1 a li li a href tab2 2 a
  • Laravel - 完整性约束违规:1452 无法添加或更新子行:外键约束失败

    我目前正在通过个人项目学习 Laravel Context 在类似博客的应用程序中 我需要将文章链接到其作者 当我保存文章时 出现以下错误 Error SQLSTATE 23000 违反完整性约束 1452 无法添加或更新子行 外键约束失败
  • Serilog Logcontext 属性在异常处理程序之后消失

    在我的网站中 我正在集成 Serilog 以将错误记录到自定义接收器 日志记录通过 LogContext 进行了丰富 其中需要传递一些自定义属性 如果我使用 Log Information 它会带着 LogEvent 中的属性到达我的接收器