2013-04-17 9 views
5

current advice on handling exceptions in NServiceBusは、組み込み機能を使用することです。エラーメッセージがエラーメッセージキューに送られ、ログがディスクに書き込まれます。NServiceBusのグローバル例外ハンドラはありますか?

しかし、同様の例外、メトリックなどの優れた機能をグループ化するための機能が優れたAirBrakeなどのサービスにエラーを送信したいのですが?私が利用できるグローバル例外ハンドラはありますか?

答えて

4

。私が現在取り組んでいるクライアントは、カスタマイズされた中央集中型ロガーを使用しています。メッセージがエラーキューに転送されるときに、NServiceBusがこのログストアにログするようにします。

NServiceBusの例外に元の例外が含まれていた場合、log4netの設定を編集することでこれを達成できました。現在のところ、NServiceBusはエラーの原因を詳細に示さない一般的なエラーメッセージを記録します。

NServiceBusは、以下の観測が含まれていNServiceBus.Faults.ErrorsNotificationsという名前のクラスがあります。

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

とき終点あなたはこれらの観測を購読することができます次の例のように、メッセージがseのときにエラーを記録する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パッケージのRx-コアをインストールする必要があります。

1

はIManageMes​​sageFailuresと呼ばれるが、私は、あなたはおそらく、あなたがやった場合は、あなた自身のために行くことを失うことになるので、あなたがセカンドレベルリトライとconjucntionでそれを使用することができます信じていません。

log4netを使用してSQL Serverにエラーを書き込むことができます。そこから、後で送信されるエラーテーブルの各エラーをマークするAPIを使用してAirBrakeに転送できますか?

+0

第2レベルの再試行でそれを使用できない場合は、本当にうんざりです。ありがとう、しかし! –

1

私は、エラーキューをフィードオフし、AirBrakeにデータをアップロードするカスタムエンドポイントを作成することをお勧めします。

サイドノート:v4.0 | 4.1には素晴らしいRest-Apiが付属していますので、エラーに対する管理機能やクエリ機能が充実しています。 ProfilerやOpsのようなツールは、このAPIを使用してさまざまな方法でデータを表示します。推奨される解決策は、監視誤差をServicePulseを使用することで、元の記事で述べたように

http://particular.net/service-platform

+0

この質問/回答はちょっと古いですが、グローバルハンドラとして存在しない理由は、各失敗がビジネス要件のコンテキストで考慮されるべきだということを学んだことです。 –

1

Serilogに切り替えると、NServiceBusのトレースを完全にサポートしています。あなたが望む場所にログイベントを送信するカスタムSerilogシンクを作成するのは簡単です。

関連する問題