下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

软件设计:gRPC全局异常捕获

作者:ElijahZeng     来源: https://www.cnblogs.com/ElijahZeng/p/10820756.html点击数:1431发布时间: 2020-04-16 15:43:44

标签: LinuxiOSAndroid

  .NET是MicrosoftXMLWebservices平台。XMLWebservices允许应用程序通过Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft.NET平台提供创建XMLWebservices并将这些服务集成在一起之所需。对个人用户的好处是无缝的、吸引人的体验。

  引

  一般的.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接口

  publicclassGrpcLogger:ILogger

  {

  publicILoggerForType<T>()

  {

  returnthis;

  }

  publicvoidDebug(stringmessage)

  {

  LogUtil.Debug(message);

  }

  publicvoidDebug(stringformat,paramsobject[]formatArgs)

  {

  LogUtil.Debug(format);

  }

  publicvoidError(stringmessage)

  {

  LogUtil.Error(message);

  }

  publicvoidError(stringformat,paramsobject[]formatArgs)

  {

  LogUtil.Error(format);

  }

  publicvoidError(Exceptionexception,stringmessage)

  {

  LogUtil.Error($"{message}:{exception.ToString()}");

  }

  publicvoidInfo(stringmessage)

  {

  LogUtil.Info(message);

  }

  publicvoidInfo(stringformat,paramsobject[]formatArgs)

  {

  LogUtil.Info(format);

  }

  publicvoidWarning(stringmessage)

  {

  LogUtil.Warn(message);

  }

  publicvoidWarning(stringformat,paramsobject[]formatArgs)

  {

  LogUtil.Warn(format);

  }

  publicvoidWarning(Exceptionexception,stringmessage)

  {

  LogUtil.Warn($"{message}:{exception.ToString()}");

  }

  }

  LogUtil是我的项目里面的日志系统工具类。此处就相当于把gRPC内部的异常日志全部记录到我自己实现的日志系统中,可以自行控制。

  ForType()是返回指定类型的日志记录器,可以通过此方法来筛选需要记录的日志。

  第二步就是直接把这个GrpcLogger类在服务初始化之后,服务开启之前申明

  GrpcEnvironment.SetLogger(newGrpcLogger());即可。

  2014年4月4号,微软在Build开发者大会上宣布开源一批.NET库和相关技术,成立.NET基金会去管理和引导开源组件的开发。2014年11月13日,微软表示将不再把.NET和VisualStudio等关键软件技术局限在Windows平台,今后还将兼容Linux、MacOSX、iOS和Android

赞(15)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程