gRPCグローバル例外キャプチャ

2461 ワード

gRPCグローバル例外キャプチャ
リード
普通のNetプロジェクト例えばASP.NET、コンソールプログラム、Windowsサービス、デスクトッププログラムなどにはframework独自のグローバル例外キャプチャメカニズムがあります.ASP.NETのExceptionFilterAttribute、コンソールとWindosサービスのAppDomain.CurrentDomain.UnhandledException.ではgRPCの異常捕獲はどのように実現されるのか.
構想
まず私が歩いている回り道を話します.私のgrpcサービスは頼りです.Netのコンソールプログラムは、TopShelfフレームワークを使用してWindowsサービスを作成します.Topshelfが持つグローバル異常の内部実装もAppDomainに対するものである.CurrentDomain.UnhandledExceptionはいくつかのパッケージを作った.しかし,この方式はgRPC内部の異常を捕獲できないことが試験で分かった.では,gRPC内部でグローバルな異常がキャプチャされたと判断したので,コンソールでUnhandledExceptionを使用してはキャプチャできない.その後、gRPCソースコードを確認し、gRPC内部のすべての異常が内部で消化され、ILoggerというログインタフェースに記録されることを発見しました.そのため、コンソールでILoggerインタフェースを実現し、gRPCサービスを初期化するときに宣言すればいいだけです.
インプリメンテーション
まず、gRPC内部のGrpcを実現する.Core.Logging.ILoggerインタフェース
 public class GrpcLogger : ILogger
    {
        public ILogger ForType()
        {
            return this;
        }

        public void Debug(string message)
        {
            LogUtil.Debug(message);
        }

        public void Debug(string format, params object[] formatArgs)
        {
            LogUtil.Debug(format);
        }

        public void Error(string message)
        {
            LogUtil.Error(message);
        }

        public void Error(string format, params object[] formatArgs)
        {
            LogUtil.Error(format);
        }

        public void Error(Exception exception, string message)
        {
            LogUtil.Error($"{message}:{exception.ToString()}");
        }

        public void Info(string message)
        {
            LogUtil.Info(message);
        }

        public void Info(string format, params object[] formatArgs)
        {
            LogUtil.Info(format);
        }

        public void Warning(string message)
        {
            LogUtil.Warn(message);
        }

        public void Warning(string format, params object[] formatArgs)
        {
            LogUtil.Warn(format);
        }

        public void Warning(Exception exception, string message)
        {
            LogUtil.Warn($"{message}:{exception.ToString()}");
        }
    }

LogUtilは私のプロジェクトのログシステムツールクラスです.ここでは,gRPC内部の異常ログをすべて自分で実現したログシステムに記録し,自分で制御できるようにする.
ForType()は、指定されたタイプのログレコーダを返し、この方法で記録するログをフィルタできます.
2つ目のステップは、このGrpcLoggerクラスをサービス初期化後、サービスが開始される前に宣言することです.
    GrpcEnvironment.SetLogger(new GrpcLogger());

できます.
転載先:https://www.cnblogs.com/ElijahZeng/p/10820756.html