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接收器,将日志事件发送到任何你想要的地方,这非常容易。如果你不能在第二级重试时使用它,那就太糟糕了。不过,谢谢!这个问题/答案有点古老,但我后来了解到,它不作为全局处理程序存在的原因是,每个失败都应该在业务需求的上下文中考虑。