首页 技术 正文
技术 2022年11月13日
0 收藏 385 点赞 3,170 浏览 1538 个字

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());

即可。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,488
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289