Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NServiceBus是否有全局异常处理程序?_Nservicebus - Fatal编程技术网

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

NServiceBus是否有全局异常处理程序?,nservicebus,Nservicebus,最重要的是使用内置设施。出错的消息进入错误消息队列,并将日志写入磁盘 但是,如果我想把我的错误发送到像AirBrake这样的服务,它有更好的功能来分组类似的异常、度量和其他好东西,该怎么办?是否可以使用全局异常处理程序?您是否可以使用自定义的log4net配置来执行此操作 NServiceBus中有一个名为IManageMessageFailures的接口,但我不相信您可以将它与第二级重试结合使用,因此如果您自己尝试,您可能会丢失它 您可以使用log4net将错误写入SQL Server,然后您

最重要的是使用内置设施。出错的消息进入错误消息队列,并将日志写入磁盘


但是,如果我想把我的错误发送到像AirBrake这样的服务,它有更好的功能来分组类似的异常、度量和其他好东西,该怎么办?是否可以使用全局异常处理程序?

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


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


您可以使用log4net将错误写入SQL Server,然后您可以使用其API将错误表中的每个错误标记为随后发送的错误转发到AirBrake。我建议您创建一个自定义端点,从错误队列中获取信息,并将数据上载到AirBrake

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


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

如果NServiceBus的异常包含原始异常,那么我们可以通过编辑log4net配置来实现这一点。目前,NServiceBus只记录一条通用错误消息,没有关于故障原因的详细信息

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

  • MessageSentToErrorQueue
  • MessageHasFailedFirstLevel重试
  • 消息已发送到SecondlevelRetries
您可以在端点启动时订阅这些观察值,如以下示例所示,该示例在消息发送到错误队列时记录错误:

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);
    }
}
公共类全局错误句柄:Iwanttorunshenbus开始和停止
{
专用只读ILogger\u记录器;
专用只读总线通知\u总线通知;
只读列表_notificationSubscriptions=新列表();
公共全局错误处理程序(ILogger记录器、总线通知总线通知)
{
_记录器=记录器;
_总线通知=总线通知;
}
公开作废开始()
{
_添加(_busNotifications.Errors.MessageSentToErrorQueue.Subscribe(LogWhenMessageSentToErrorQueue));
}
公共停车场()
{
foreach(通知订阅中的var订阅)
{
subscription.Dispose();
}
}
private void LogWhen消息进入错误队列(FailedMessage消息)
{
var属性=新
{
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.Exception);
}
}

observable是通过使用反应式扩展实现的,因此您必须安装NuGet软件包Rx Core才能工作。

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

如果你不能在第二级重试时使用它,那就太糟糕了。不过,谢谢!这个问题/答案有点古老,但我后来了解到,它不作为全局处理程序存在的原因是,每个失败都应该在业务需求的上下文中考虑。