NServiceBus での例外処理に関する現在のアドバイスは、組み込みの機能を使用することです。エラーが発生したメッセージはエラー メッセージ キューに送られ、ログがディスクに書き込まれます。
しかし、同様の例外、メトリック、およびその他の優れた機能をグループ化するためのより優れた機能を備えた AirBrake のようなサービスにエラーを送信したい場合はどうすればよいでしょうか? 利用できるグローバル例外ハンドラはありますか?
NServiceBus での例外処理に関する現在のアドバイスは、組み込みの機能を使用することです。エラーが発生したメッセージはエラー メッセージ キューに送られ、ログがディスクに書き込まれます。
しかし、同様の例外、メトリック、およびその他の優れた機能をグループ化するためのより優れた機能を備えた AirBrake のようなサービスにエラーを送信したい場合はどうすればよいでしょうか? 利用できるグローバル例外ハンドラはありますか?
元の投稿で述べたように、推奨される解決策は、エラーの監視に ServicePulse を使用することです。私が現在働いているクライアントは、カスタムメイドの集中型ロガーを使用しており、メッセージがエラーキューに転送されるときに、NServiceBus がこのログストアにログを記録するようにしたいと考えています。
NServiceBus からの例外に元の例外が含まれていた場合、log4net 構成を編集するだけでこれを達成できました。現在、NServiceBus は、失敗の原因に関する詳細なしで一般的なエラー メッセージをログに記録するだけです。
NServiceBus には、次のオブザーバブルを含む NServiceBus.Faults.ErrorsNotifications という名前のクラスがあります。
メッセージがエラー キューに送信されたときにエラーをログに記録する次の例のように、エンドポイントの開始時にこれらのオブザーバブルをサブスクライブできます。
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);
}
}
オブザーバブルは Reactive Extensions を使用して実装されるため、これを機能させるには NuGet パッケージ Rx-Core をインストールする必要があります。
NServiceBus には IManageMessageFailures と呼ばれるインターフェイスがありますが、それを Second Level Retries と組み合わせて使用できるとは思えないため、自分で行った場合はおそらくそれを失うことになります。
log4net を使用して SQL Server にエラーを書き込むことができ、そこから API を使用して AirBrake に転送し、エラー テーブル内の各エラーを後で送信されるようにマークすることができますか?
Serilog に切り替えました。これには、NServiceBus の完全なログとトレースのサポートがあります。ログ イベントを任意の場所に送信するカスタム Serilog シンクを作成するのは非常に簡単です。
カスタムlog4net構成を使用してそれを行うことができますか?
http://help.airbrake.io/discussions/suggestions/157-net-plug-in-for-api-v2