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

时间:2013-04-17 19:51:40

标签: nservicebus

current advice on handling exceptions in NServiceBus是使用内置设施。错误的消息将转到错误消息队列,并将日志写入磁盘。

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

5 个答案:

答案 0 :(得分:4)

正如原帖中所提到的,建议的解决方案是使用ServicePulse来监控错误。我目前工作的客户端使用自定义集中式记录器,我们希望NServiceBus在消息转发到错误队列时登录到此日志存储。

如果NServiceBus中的异常包含原始异常,我们可以通过编辑log4net配置来实现这一点,目前NServiceBus只记录一般错误消息,但没有详细说明导致失败的原因。

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

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

您可以在端点启动时订阅这些observable,就像下面的示例一样,当消息发送到错误队列时会记录错误:

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);
    }
}

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

答案 1 :(得分:1)

您是否可以使用自定义log4net配置来执行此操作?

http://help.airbrake.io/discussions/suggestions/157-net-plug-in-for-api-v2

答案 2 :(得分:1)

NServiceBus中有一个名为IManageMes​​sageFailures的界面,但我不相信你可以在二级重试中使用它,所以你可能会失去它,如果你自己去了。

您可以使用log4net将错误写入SQL Server,然后您可以使用他们的API将它们转发到AirBrake,标记错误表中的每个错误,然后发送它们吗?

答案 3 :(得分:1)

我建议您创建一个自定义端点,该端点可以提供错误队列并将数据上传到AirBrake。

附注:v4.0 | 4.1将带有一个很好的Rest-Api,为您提供良好的错误管理/查询功能。像Profiler和Ops这样的工具将使用此API以各种方式向您显示数据。

http://particular.net/service-platform

答案 4 :(得分:1)

我们切换到Serilog,它为NServiceBus提供了完美的日志记录和跟踪支持。创建一个自定义Serilog接收器,可以随时随地发送日志事件。