我正在使用NServiceBus 4.6和Serilog。我已经配置NServiceBus通过以下方式使用Serilog:
global::NServiceBus.SetLoggingLibrary.Custom(new SeriLoggerFactory());
工厂本身也非常简单:
public class SeriLoggerFactory : ILoggerFactory
{
public ILog GetLogger(Type type)
{
return new SeriLoggerAdapter(Log.ForContext(type));
}
public ILog GetLogger(string name)
{
var contextLogger = Log.ForContext("SourceContext", name);
return new SeriLoggerAdapter(contextLogger);
}
}
我肯定会得到与NServiceBus相关的日志条目,但是缺少的一件事是处理消息但引发异常时的异常详细信息。我可以在NServiceBus消息标题中看到异常信息(直接通过查看错误队列中的消息或通过Service Insight),但是NServiceBus记录的消息缺少最相关的信息:
ID为'0d255d19-85f9-4915-a27c-a41000da12ed'的消息的FLR失败
并将移交给SLR进行重试1
要么
SLR无法通过消息解决问题
0d255d19-85f9-4915-a27c-a41000da12ed,并将转发给
MYERRORQUEUE的错误队列
没有有关根异常的任何详细信息,会使调试变得有些困难。它要求开发人员打开Service Insight,或打开工具以查看队列本身中的消息。两者都很麻烦,而且都缺乏可扩展性。
例如,Serilog允许您创建ILogEventEnricher类,这些类可以记录有关该异常的特殊详细信息-异常上的简单.ToString不会记录的内容。没有NServiceBus实际记录我的异常,我就无法提取这些详细信息。
我在这里想念什么?
最佳答案
NServiceBus有一个名为NServiceBus.Faults.ErrorsNotifications的类,其中包含以下可观察对象:
MessageSentToErrorQueue
MessageHasFailedAFirstLevelRetryAttempt
MessageHasBeenSentToSecondLevelRetries
您可以在端点启动时订阅这些可观察对象,例如以下示例,该示例记录将错误消息发送到第一级重试:
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.MessageHasFailedAFirstLevelRetryAttempt.Subscribe(LogWhenMessageSentToFirstLevelRetry));
}
public void Stop()
{
foreach (var subscription in _notificationSubscriptions)
{
subscription.Dispose();
}
}
private void LogWhenMessageSentToFirstLevelRetry(FirstLevelRetry 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 first level retry. " + properties, message.Exception);
}
}
该可观察对象是通过使用Reactive Extensions实现的,因此您必须安装NuGet包Rx-Core才能起作用。
关于c# - 配置NServiceBus记录导致消息重试的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27696539/