मूल पोस्ट में उल्लेख किया सिफारिश समाधान के रूप में त्रुटियों की निगरानी के लिए ServicePulse उपयोग करने के लिए है। जिस क्लाइंट के लिए मैं वर्तमान में काम करता हूं वह एक कस्टम बनाया गया केंद्रीकृत लॉगर का उपयोग कर रहा है, और हम एनएस सर्विसबस को इस लॉग स्टोर में लॉग इन करना चाहते हैं जब संदेशों को त्रुटि कतार में अग्रेषित किया जाता है।
अगर हम NServiceBus के अपवाद को मूल अपवाद शामिल करते हैं तो हम लॉग 4नेट कॉन्फ़िगरेशन को संपादित करके इसे हासिल कर सकते थे, वर्तमान में NServiceBus केवल एक सामान्य त्रुटि संदेश लॉग करता है जिसमें विफलता के कारण के बारे में कोई विवरण नहीं है।
NServiceBus एक वर्ग नामित NServiceBus.Faults.ErrorsNotifications जो निम्नलिखित observables शामिल है:
- MessageSentToErrorQueue
- MessageHasFailedAFirstLevelRetryAttempt
- MessageHasBeenSentToSecondLevelRetries
आप इन observables की सदस्यता ले सकते जब endpoint शुरू होता है, जैसा कि निम्न उदाहरण में है जो संदेशों से होने पर त्रुटि लॉग करता है NT त्रुटि कतार में:
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);
}
}
नमूदार रिएक्टिव एक्सटेंशन का उपयोग द्वारा कार्यान्वित किया जाता है, तो आप NuGet पैकेज आरएक्स कोर स्थापित करने के लिए यह काम करने के लिए होगा।
यह वास्तव में बेकार है अगर आप इसे दूसरे स्तर की रीट्रीज़ के साथ उपयोग नहीं कर सकते हैं। हालांकि धन्यवाद! –