NServiceBus是否有全局异常处理程序?

Jos*_*off 5 nservicebus

在NServiceBus中处理异常当前建议是使用内置工具.错误的消息将转到错误消息队列,并将日志写入磁盘.

但是,如果我想将我的错误发送到像AirBrake这样的服务,该服务具有更好的功能来分组类似的异常,指标和其他好东西呢?我可以使用全局异常处理程序吗?

sve*_*ide 4

正如原始帖子中提到的,推荐的解决方案是使用 ServicePulse 来监视错误。我目前工作的客户端正在使用定制的集中式记录器,当消息转发到错误队列时,我们希望 NServiceBus 记录到此日志存储。

如果 NServiceBus 的异常包含原始异常,我们可以通过编辑 log4net 配置来实现此目的,目前 NServiceBus 仅记录一条通用错误消息,没有有关导致失败的原因的详细信息。

NServiceBus 有一个名为 NServiceBus.Faults.ErrorsNotifications 的类,其中包含以下可观察值:

  • 消息发送到错误队列
  • 消息已失败第一级重试尝试
  • 消息已发送至第二级重试

您可以在端点启动时订阅这些可观察量,如下例所示,该示例在消息发送到错误队列时记录错误:

public class GlobalErrorHandler : IWantToRunWhenBusStartsAndStops
{
    private readonly ILogger _logger;
    private readonly BusNotifications _busNotifications;
    readonly List<IDisposable> _notificationSubscriptions = new List<IDisposable>();

    public GlobalErrorHandler(ILogger logger, BusNotifications busNotifications)
    {
        _logger = logger;
        _busNotifications = busNotifications;
    }

    public void Start()
    {
        _notificationSubscriptions.Add(_busNotifications.Errors.MessageSentToErrorQueue.Subscribe(LogWhenMessageSentToErrorQueue));
    }

    public void Stop()
    {
        foreach (var subscription in _notificationSubscriptions)
        {
            subscription.Dispose();
        }
    }

    private void LogWhenMessageSentToErrorQueue(FailedMessage message)
    {
        var properties = new
        {
            MessageType = message.Headers["NServiceBus.EnclosedMessageTypes"],
            MessageId = message.Headers["NServiceBus.MessageId"],
            OriginatingMachine = message.Headers["NServiceBus.OriginatingMachine"],
            OriginatingEndpoint = message.Headers["NServiceBus.OriginatingEndpoint"],
            ExceptionType = message.Headers["NServiceBus.ExceptionInfo.ExceptionType"],
            ExceptionMessage = message.Headers["NServiceBus.ExceptionInfo.Message"],
            ExceptionSource = message.Headers["NServiceBus.ExceptionInfo.Source"],
            TimeSent = message.Headers["NServiceBus.TimeSent"]
        };

        _logger.Error("Message sent to error queue. " + properties, message.Exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

observable 是通过使用 Reactive Extensions 实现的,因此您必须安装 NuGet 包 Rx-Core 才能使其工作。