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<T>()
{
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()是返回指定类型的日志记录器,可以通过此方法来筛选需要记录的日志。

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

    GrpcEnvironment.SetLogger(new GrpcLogger());

即可。

最新文章

  1. Qt StyleSheet皮肤css源码
  2. include、require、include_once和require_once理解
  3. 下载最新版本的Oracle Database
  4. TP-LINK WR841N V8刷OpenWRT
  5. /etc/pam.d 与 /etc/security 密码策略
  6. 当标签上写了runat=&quot;server&quot; 后,&lt;%%&gt;就会无效
  7. AsyncEnumerableExtensions.cs z
  8. Linux中/etc/passwd文件与/etc/shadow文件解析.
  9. python 时间字符串与日期转化
  10. oracle_一次移动数据库dbf文件的操作
  11. raft协议安全性保证
  12. IM多类型holder封装
  13. Python学习案例之视频人脸检测识别
  14. 解决Ajax请求后台Servlet接口拿不到JSON数据问题
  15. 第一个Python窗口
  16. JMeter&#160;配置元件之HTTP&#160;Cookie&#160;Manager&#160;介绍
  17. win32进程概念之句柄表,以及内核对象.
  18. 通过Parcelable协议传递数据出现系列错误
  19. ubuntu 16.04 安装Tensorflow
  20. 棋盘格 测量 相机近似精度 (像素精度&amp;物理精度)

热门文章

  1. 使用json_decode无法解析json
  2. 为什么在index.jsp里面引入了common.js,在item-add.jsp以及其他一些jsp文件里面就不需要引入common.jsne ?
  3. CSS隐藏overflow默认滚动条同时保留滚动效果
  4. 【codeforces 734F】Anton and School
  5. 为什么要重写toString()方法
  6. windows部署iBase4J
  7. spring boot学习(转)
  8. HDU——T 1498 50 years, 50 colors
  9. HDU 2865
  10. 三种SVM的对偶问题