fabirc1.0商业正式版本源码解析3——日志系统

2024-06-06 18:38

本文主要是介绍fabirc1.0商业正式版本源码解析3——日志系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里所说的日志,是指程序运行过程中打印到终端或日志文件,记录程序运行过程的日志,而非涉及到fabric记录交易数据,账本数据一类的交易日志。其实日志系统机制对于源码研究可以忽略,且相对简单,但是一方面日志系统对于程序运行和调试必不可少,fabric如何形成这个日志系统可以学习学习,日志所打印的内容对阅读源码也是一种提示;另一方面不弄清楚这个日志,在阅读源码的过程中这些到处出现的打印日志总像围绕在源码上面的蚊子一样,闹心。

fabric的日志系统主要使用了第三方包Go-logging,可在github.com/op/go-logging下载。很少一部分使用了go语言标准库中的log。在此基础上fabric自己封装出来了flogging,这个f,应该代表fabric吧,意思是说这是fabric的logging。代码集中在fabric/common/flogging目录下,供项目全局使用。

go-logging简介

简单点儿,logging其实就是封装了各种打印格式,包括消息层级上的,如DEBU、消息、注意、警告、错误,包括消息颜色上的,如消息是正常的绿色、错误则是醒目的红色。

基本用法如下:

//创建一个名字为examplename的日志对象log
var log = logging.MustGetLogger("examplename")
//创建一个日志输出格式对象format,也就是用什么格式输出
var format = logging.MustStringFormatter(`%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`,
)
//创建一个日志输出对象backend,也就是日志要打印到哪儿,在此是标准错误输出
backend := logging.NewLogBackend(os.Stderr, "", 0)
//将输出格式与输出对象绑定
backendFormatter := logging.NewBackendFormatter(backend, format)
//将绑定了格式的输出对象设置为日志的输出对象
//这样log打印每一句话都会按格式输出到backendFormatter所代表的对象里,在此即是标准错误输出
logging.SetBackend(backendFormatter)
//log打印依据Info信息
log.Info("info")
//log打印一句Error信息
log.Error("err")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

更多详细的用法,请在go doc或库中自行学习。

flogging

在flogging目录下有两个文件,grpclogger.gologging.go

grpclogger.go用于设置grpc的日志,因为grpc默认只是用go语言的标准日志接口,因此将logging封装成go语言的标准日志形式的结构type grpclogger struct {logger *logging.Logger},然后通过initgrpclogger()生成对象供grpc使用,从而实现让grpc也使用flogging的效果。

logging.go文件中,自带一个名为flogging的日志记录者logger,同时规定了默认的日志格式,日志等级,用defaultFormatdefaultLevel常量表示。默认的输出端defaultOutput,并有用于存放所有fabric模块日志的级别映射modules map[string]string,从类型上看其存储的日志级别都字符串化了。最后还有一个存放每个peer启动之时的日志级别的映射peerStartModules map[string]string,由在每个peer启动完成之时调用SetPeerStartupModulesMap()初始化,并可通过调用RevertToPeerStartupLevels()恢复初始值。

init函数

init()函数通过调用Reset()函数等初始化了一系列默认值,如默认的输出端被设置成标准错处输出,默认输出级别这设置成info级别。最后调用initgrpclogger()初始化了grpc的日志对象。

MustGetLogger函数

在许多各级不同模块的源码中,在全局的开始处都有类似一句这样的调用,如在fabric/peer/main.go中:var logger = flogging.MustGetLogger("main")。这就是调用MustGetLogger函数生成一个名为指定了名字的日志对象,用以记录该模块的日志,并用安全的方式(用锁的方式)将该对象记录日志的级别备案到modules中。MustGetLogger函数内部依然用的是go-logging库的相应函数logging.MustGetLogger()生成的日志对象。

其他函数

在logging.go中的其他函数,基本都是了封装go-logging库函数,供fabric全局使用。如SetModuleLevel函数,调用来调用去,其实就是封装了go-logging库中的logging.SetLevel()函数,以达到符合fabric自己使用要求的目的,可谓万变不离其宗

这篇关于fabirc1.0商业正式版本源码解析3——日志系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036917

相关文章

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应