gRPC全局异常捕获
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());
即可。
gRPC全局异常捕获的更多相关文章
- MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
public class BaseController : Controller { /// <summary> /// Called after the action method is ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- Spring-MVC开发之全局异常捕获全面解读
异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...
- Asp.Net MVC3(三)-MvcApp实现全局异常捕获
定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...
- 使用spring利用HandlerExceptionResolver实现全局异常捕获
最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
- (转)C#中的那些全局异常捕获
C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html) 1.WPF全局捕获异常 public partia ...
- springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)
在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...
随机推荐
- Django中模块的加载原理
Django中的module的加载是通过反射来完成的,借助importlib中的import_module函数来实现的动态加载.import_module的内部通过使用了递归和线程锁,字符串的切割,实 ...
- C语言基本语法——数组
一.一维数组 1.什么是数组 2.数组语法 3.下标 4.初始化 5.数组名和数组首地址 二.一维数组的应用 1.数组的赋值与拷贝 2.数组的正反遍历 3.随机数 4.数组乱序 5.数组的重复 三.二 ...
- 决策树(Decision Trees)
简介 决策树是一个预测模型,通过坐标数据进行多次分割,找出分界线,绘制决策树. 在机器学习中,决策树学习算法就是根据数据,使用计算机算法自动找出决策边界. 每一次分割代表一次决策,多次决策而形成决策树 ...
- pytorch 4 regression 回归
import torch import torch.nn.functional as F import matplotlib.pyplot as plt # torch.manual_seed(1) ...
- [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)
c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...
- List<T>与List<?>的区别
T 代表某一类型 ? 代表任意类型.. T因为代表是某一确定类型..所以你可以使用它..比如你有个List<T>类型的变量tList 你可以用T t = tList.get(1);也可以用 ...
- Jquery学习总结(3)——Jquery获取当前城市的天气信
Jquery代码: function findWeather() { var cityUrl = 'http://int.dpool.sina.com.cn/iplookup/iplookup ...
- jvm 虚拟机的组成部分
1.类加载子系统 :负责从文件系统或者网络中加载 Class 信息,加载的信息存放在 一块称之为方法区的内存空间 2.方法区:存放类信息,常量信息,常量池信息,包括字符串字面量和数字常量等 3.Jav ...
- Run Nutch In Eclipse on Linux and Windows nutch version 0.9
Running Nutch in Eclipse Here are instructions for setting up a development environment for Nutch un ...
- .C#-NET开源方向基本
我的理解,nancyFx是一个.net的微型框架,可以在Linux环境下运行,ServiceStack也是全平台框架,更大一些 owin的概念:Open Web Server Interface Fo ...