【问题标题】:How to log MassTransit CorrelationId with Serilog?如何使用 Serilog 记录 MassTransit CorrelationId?
【发布时间】:2018-02-22 00:23:42
【问题描述】:

我正在使用 MassTransit 3.5.7。我在启动总线之前添加了相关ID:

MessageCorrelation.UseCorrelationId<ICustomerRegistered>(x => x.CustomerGuid);
MessageCorrelation.UseCorrelationId<ICustomerUpdated>(x => x.Customer.Guid);
MessageCorrelation.UseCorrelationId<IOrderPaid>(x => x.OrderGuid);
MessageCorrelation.UseCorrelationId<IOrderPaymentAuthorized>(x => x.OrderGuid);
MessageCorrelation.UseCorrelationId<IOrderPlaced>(x => x.Order.OrderGuid);
MessageCorrelation.UseCorrelationId<IOrderRefunded>(x => x.OrderGuid);

我使用 Serliog 2.5.0 进行日志记录:

Bus.Factory.CreateUsingAzureServiceBus(serviceBus =>
{
    serviceBus.UseSerilog();
    ...
}

我可以看到 CorrelationId 已添加到消息标头中,但它没有作为自定义属性添加到日志中。

我需要做什么才能记录所有已记录消息的 CorrelationId?

更新:

我实现了一个 Serilog 丰富器和一个像 here 这样的 MassTransit 自定义中间件,但相关 id 只记录在接收的(消费的)消息中。发布消息时不记录。有谁知道发布消息时如何记录相关 ID?

【问题讨论】:

  • 我对公共交通不太熟悉。但我查看了他们的Serilog integration code,它似乎没有提供任何捕获相关 ID 的方法。也许您可以编写一些custom middleware 来获取相关ID 并使用enrichment 将相关ID 添加到记录的事件中?
  • 啊,好像有人有done just that
  • @mason,感谢您的帮助。我找到了那个要点并试图实现它,但我认为他正在尝试解决一个不同的问题。他没有在 MassTransit 中设置 CorrelationId,但他正在设置来自 http 请求的自定义 Guid(实际上是代码中的 Guid.NewGuid())。我需要使用 MassTransit 中设置的 CorrelationId。
  • 嗯 .. 在查看了更多代码之后,我认为这可能是我需要的。明天我将再次尝试实施。再次感谢。
  • @mason 我试图从要点中实现代码,但相关 id 仅添加到消费的消息中。它不会添加到已发布的消息中。我在服务总线配置上调用了 UseSeriLogEnricher 方法,不仅在接收端点上,而且我仍然只在消费的消息上获得相关 ID。有什么想法吗?

标签: masstransit serilog


【解决方案1】:

你可以很容易地做到这一点,而且你是对的,它使用你自己的中间件。

我在example 中就是这样做的。现在我正在使用 LibLog(因此您将看到 LogProvider)。但是如果你直接引用 SeriLog,那么你可以简单地做LogContext.PushProperty(...),你仍然会得到同样的效果

【讨论】:

【解决方案2】:

您可以在自定义公共交通过滤器中执行此操作。 如果你设置了一个过滤器

cfg.ConfigureSend(c => c.UseSendFilter(new YourSendFilter()));

或用于发布

cfg.ConfigurePublish(c => c.UseSendFilter(new YourSendFilter()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多