zoukankan      html  css  js  c++  java
  • 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());
    

    即可。

  • 相关阅读:
    ubuntu下使用sudo 出现unable to resolve host 解决方法
    Ubuntu下使用mysqli-connect连接mysql时报错:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    Ubuntu下安装LNMP之独立添加php扩展模块
    Ubuntu下安装LNMP之Mysql的安装及卸载
    Ubuntu下安装LNMP之php7的安装并配置Nginx支持php及卸载php
    Ubuntu使用vim编辑器时出现上下左右键变成ABCD
    Ubuntu下安装LNMP之nginx的卸载
    Ubuntu下使用find / -name aaa* 提示“find: 路径必须在表达式之前: XXXX”
    Ubuntu下安装LNMP之nginx的安装
    ubuntu使用su切换root用户提示“认证失败”
  • 原文地址:https://www.cnblogs.com/ElijahZeng/p/10820756.html
Copyright © 2011-2022 走看看