zoukankan      html  css  js  c++  java
  • 如何在golang中打印grpc详细日志

    最近捣鼓fabric,在一个tls证书问题上纠结挺久,连接orderer服务时候,grpc日志总是冷冰冰的显示这个信息

    Orderer Client Status Code: (2) CONNECTION_FAILED. Description
    

    真想请它告诉我,这么个错误码,到底有啥用?!

    真是日志用时方恨少,这种时候,我们就需要详细的日志告诉我们到底哪儿出错了是不是?一番百度之后,参考了一篇大神的文章后,终于把问题解决了。

    咱们开始上手吧!

    思路

    grpc包含了grpclog包,用于其日志的处理,同时定义了LoggerV2的接口。

    因此,只要实现LoggerV2的接口,并通过SetLoggerV2(l LoggerV2)接口将实现的对象设置到grpclog包中,就可以自定义日志输出,同时上层应用也可以使用grpclog进行业务日志打印。

    实现

    就拿fabric-sdk-go的源码来举例:

    1.添加LoogerV2接口实现

    我们可以在util目录下添加文件grpclogger.go,其中内容如下

    目录和名字不重要,关键是内容

    结构体名称任意,之所以取名ZapLogger,是因为我参照的文章使用了uber的zaplogger实现(而我们只使用了fabric-sdk-go中的实现)

    package util
    
    import (
    	"github.com/hyperledger/fabric-sdk-go/pkg/common/logging"
    )
    
    type ZapLogger struct {
    	logger logging.Logger
    }
    
    // NewZapLogger 创建封装了zap的对象,该对象是对LoggerV2接口的实现
    func NewZapLogger(logger *logging.Logger) *ZapLogger {
    	return &ZapLogger{
    		logger: *logger,
    	}
    }
    
    // Info returns
    func (zl *ZapLogger) Info(args ...interface{}) {
    	zl.logger.Info(args)
    }
    
    // Infoln returns
    func (zl *ZapLogger) Infoln(args ...interface{}) {
    	zl.logger.Info(args...)
    }
    
    // Infof returns
    func (zl *ZapLogger) Infof(format string, args ...interface{}) {
    	zl.logger.Infof(format, args...)
    }
    
    // Warning returns
    func (zl *ZapLogger) Warning(args ...interface{}) {
    	zl.logger.Warn(args...)
    }
    
    // Warningln returns
    func (zl *ZapLogger) Warningln(args ...interface{}) {
    	zl.logger.Warn(args...)
    }
    
    // Warningf returns
    func (zl *ZapLogger) Warningf(format string, args ...interface{}) {
    	zl.logger.Warnf(format, args...)
    }
    
    // Error returns
    func (zl *ZapLogger) Error(args ...interface{}) {
    	zl.logger.Error(args...)
    }
    
    // Errorln returns
    func (zl *ZapLogger) Errorln(args ...interface{}) {
    	zl.logger.Error(args...)
    }
    
    // Errorf returns
    func (zl *ZapLogger) Errorf(format string, args ...interface{}) {
    	zl.logger.Errorf(format, args...)
    }
    
    // Fatal returns
    func (zl *ZapLogger) Fatal(args ...interface{}) {
    	zl.logger.Fatal(args...)
    }
    
    // Fatalln returns
    func (zl *ZapLogger) Fatalln(args ...interface{}) {
    	zl.logger.Fatal(args...)
    }
    
    // Fatalf logs to fatal level
    func (zl *ZapLogger) Fatalf(format string, args ...interface{}) {
    	zl.logger.Fatalf(format, args...)
    }
    
    // V reports whether verbosity level l is at least the requested verbose level.
    func (zl *ZapLogger) V(v int) bool {
    	return false
    }
    

    2、将实现的对象设置到grpclog包中

    如前文所述,我们通过SetLoggerV2(l LoggerV2)接口将实现的对象设置到grpclog包中

    在将进行grpc操作的方法里,添加相关代码。
    这样的文件可以是

    # 文件: pkgfabcommconnector.go
    func (cc *CachingConnector) createConn(ctx context.Context, target string, opts ...grpc.DialOption) (*cachedConn, error)
    

    添加如下代码:

    var logger = logging.NewLogger("grpcLogger")
    grpclog.SetLoggerV2(util.NewZapLogger(logger))
    

    3、试一试是否成功?

    随后,我的程序得到了这样的日志

     [grpcLogger] 2019/02/13 18:53:24 UTC - util.(*ZapLogger).Warningf -> WARN grpc:
     addrConn.createTransport failed to connect to {ord1-yc-leader-hlf-ord.yc-leader:7050 0  <nil>}.
     Err :connection error: desc = "transport: authentication handshake failed: 
     x509: certificate is valid for ord1-yc-leader-hlf-ord.yc-leader, not ord1-yc-leader-hlf-ord".
     Reconnecting...
    

    可以看到,报错原因就很详细了。

    大功告成!

    参考文章:

    go基于grpc构建微服务框架-结构化日志输出

  • 相关阅读:
    Activity的四种launchMode
    Activity及Intent
    关于android中PendingIntent.getBroadcase的注册广播
    C# Parallel用法
    用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
    CursorAdapter中getView newView bindView异同
    Android四大组件之ContentProvider
    Android 自动换行流式布局的RadioGroup
    真机无法接收到android.provider.Telephony.SMS_RECEIVED的问题
    Wiz开发 定时器的使用与处理
  • 原文地址:https://www.cnblogs.com/laolieren/p/print_log_detail_in_grpc_with_golang.html
Copyright © 2011-2022 走看看