首页 技术 正文
技术 2022年11月19日
0 收藏 632 点赞 2,278 浏览 2723 个字

最近捣鼓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 utilimport (
"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操作的方法里,添加相关代码。

这样的文件可以是

# 文件: pkg\fab\comm\connector.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构建微服务框架-结构化日志输出

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