【问题标题】:Correlation Id for listener while using Serilog in .Net core在 .Net 核心中使用 Serilog 时侦听器的相关 ID
【发布时间】:2019-01-25 01:32:50
【问题描述】:

我有一个 .net 核心控制台应用程序,它是 RabbitMQ 的侦听器。另外我正在使用 Serilog 进行日志记录。将消息推送到队列中的 API 在消息中添加一个相关 ID 作为参数。在编写日志时,我希望将 CorrelationID(在 serilog config 的输出模板中指定)替换为消息中可用的,以端到端跟踪操作。任何人都可以提出一种方法来实现这一点吗?

注意:如果是 Web 请求,Serilog 提供的中间件(Scoped Middleware 或 LogContext)来救援。但是,它们需要 HttpContext(出于显而易见的原因)。对于这种监听器请求,我一直在寻找解决方案

非常感谢任何帮助

【问题讨论】:

    标签: logging .net-core correlation serilog


    【解决方案1】:

    在您收到消息时,您应该能够

    using (LogContext.PushProperty("corrId", msg.CorrId))
        ProcessMessage(msg)
    

    您还可以add a ....|{Properties} element into your log format string 获取与给定消息关联的消息模板中未使用的任何属性(但听起来您已经涵盖了)

    【讨论】:

    • 非常感谢您的建议。这就像一个魅力。
    • 想知道这是否可以从主代码中移出(例如我们如何在网络应用程序中使用中间件)。这只是为了确保其他模块在 Startup.cs 等公共位置复制相同内容,而不是找到 ProcessMessage 的确切位置来包含此更改
    • 是的,如果它与 HTTP req 处理器 1:1 是自然的事情,你可以用它制作一个中间件,但我会说对于消息处理循环,内联是一个自然的地方为此 - Dispose 分层可能很重要,所以最好将它内联是我的默认方法
    • 当然鲁本。感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多