5

NServiceBus での例外処理に関する現在のアドバイスは、組み込みの機能を使用することです。エラーが発生したメッセージはエラー メッセージ キューに送られ、ログがディスクに書き込まれます。

しかし、同様の例外、メトリック、およびその他の優れた機能をグループ化するためのより優れた機能を備えた AirBrake のようなサービスにエラーを送信したい場合はどうすればよいでしょうか? 利用できるグローバル例外ハンドラはありますか?

4

5 に答える 5

4

元の投稿で述べたように、推奨される解決策は、エラーの監視に ServicePulse を使用することです。私が現在働いているクライアントは、カスタムメイドの集中型ロガーを使用しており、メッセージがエラーキューに転送されるときに、NServiceBus がこのログストアにログを記録するようにしたいと考えています。

NServiceBus からの例外に元の例外が含まれていた場合、log4net 構成を編集するだけでこれを達成できました。現在、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.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 をインストールする必要があります。

于 2015-04-13T08:42:08.870 に答える
1

NServiceBus には IManageMes​​sageFailures と呼ばれるインターフェイスがありますが、それを Second Level Retries と組み合わせて使用​​できるとは思えないため、自分で行った場合はおそらくそれを失うことになります。

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

于 2013-04-18T13:22:03.570 に答える
1

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

于 2015-04-14T13:39:48.710 に答える
1

カスタムlog4net構成を使用してそれを行うことができますか?

http://help.airbrake.io/discussions/suggestions/157-net-plug-in-for-api-v2

于 2013-04-18T11:35:09.967 に答える