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 / ...
随机推荐
- THINKPHP实现搜索分页保留搜索条件
使用tp自带的分页类时,里面自带了POST查询条件保留机制,但是之针对于普通的map一维数组,如果包含like,gt等等比较复杂的查询条件则力不从心了. 带入查询条件 如果是POST方式查询,如何确保 ...
- js Math常用方法
------------------------ 向上取整,有小数就整数部分加1 Math.ceil(5/2) ------------------------ 四舍五入. Math.round(5/ ...
- C#-常用对象-思维导图
C#-常用对象-思维导图 链接:http://pan.baidu.com/s/1jHNgS78 密码:3i74 如有错误,请告知我!
- Apache Tez on hive
———————————————————— 调配 Hadoop ———————————————————— 1 将 编译好的 TEZ .tar.gz 文件上传到 HDFS 中. hdfs fs -p ...
- shell脚本学习之ubuntu删除多余内核
#!/bin/bash #定期删除内核 #存储命令输出cmd_output=`commands` uname_output=$(uname -r) kernel_output=`dpkg --list ...
- Android与server通信的方法之中的一个(json)效率不高安全性不好
http通信.以xml或者json为载体.相互通信数据. Android对于http的网络通信,提供了标准的java接口--httpURLConnection接口.以及apache的接口--httpc ...
- 关于Javakeywordsynchronized——单例模式的思考
精彩的设计模式盛宴刚刚落下帷幕.三天的时间.真是学习到了非常多.当中,遗留的非常多的问题.今天就谈谈synchronized这个keyword.关于对synchronizedkeyword的思考是从单 ...
- Linux内核编译測试
内核编译: Step 1:配置内核编译选项. make menuconfig Optional Step :排除编译结果文件(.o)等之间的依赖性. make mrproper Optional St ...
- Python之Linux下的virtualenv
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- HTTP报文头解析
HTTP报文头解析 本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该 ...