5

当前在 NServiceBus 中处理异常的建议是使用内置设施。出错的消息进入错误消息队列,并将日志写入磁盘。

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

4

5 回答 5

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 才能使其工作。

于 2015-04-13T08:42:08.870 回答
1

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

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

于 2013-04-18T11:35:09.967 回答
1

NServiceBus 中有一个名为 IManageMes​​sageFailures 的接口,但我不相信您可以将它与二级重试结合使用,因此如果您自己使用它,您可能会失去它。

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

于 2013-04-18T13:22:03.570 回答
1

我建议您创建一个自定义端点,从错误队列中获取数据并将数据上传到 AirBrake。

旁注:v4.0|4.1 将附带一个很好的 Rest-Api,它为您提供很好的错误管理/查询功能。Profiler 和 Ops 等工具将使用此 api 以各种方式向您呈现数据。

http://particular.net/service-platform

于 2013-04-18T15:38:45.937 回答
1

我们切换到 Serilog,它对 NServiceBus 具有完美的日志记录和跟踪支持。创建一个自定义的 Serilog 接收器,将您的日志事件发送到您想要的任何地方非常容易。

于 2015-04-14T13:39:48.710 回答