区块链教程Fabric1.0源代码分析flogging(Fabric日志系统),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

Fabric 1.0源代码笔记 之 flogging(Fabric日志系统)

1、flogging概述

flogging,即fabric logging,对第三方日志包go-logging做了封装,供全局使用。go-logging地址:https://github.com/op/go-logging。
flogging代码集中在common/flogging目录下,包括logging.go和grpclogger.go。

  • logging.go,定义了默认的日志格式、日志级别和日志输出,以及modules和peerStartModules做模块和日志级别的映射。并定义了若干对go-logging封装的函数。
  • grpclogger.go,基于封装go-logging定义了结构体grpclogger及其方法,并用于设置grpclog。grpclog默认使用go标准库日志包,此举可使得grpclog也使用go-logging和flogging功能。

2、flogging的常量和全局变量

涉及常量:pkgLogID、defaultFormat和defaultLevel,分别表示仅在flogging包内代码使用的go-logging名称、默认的日志格式和默认的日志级别。

涉及全局变量如下:

var (logger *logging.Logger //仅在flogging包内代码使用的logging.Logger对象defaultOutput *os.File //默认的日志输出modules          map[string]string //保存所有模块及其各自的日志级别的映射peerStartModules map[string]string //存储内容与modules相同lock sync.RWMutex //RWMutex读写锁once sync.Once    //对于从全局的角度只需要运行一次的代码,比如全局初化操始作,go语言提供了一个Once类型来保证全局的唯一性操作
)
//代码在common/flogging/logging.go

3、flogging对go-logging的封装

3.1、flogging包初始化

flogging包初始化,即init()函数,代码如下:

func init() {logger = logging.MustGetLogger(pkgLogID) //创建仅在flogging包内代码使用的logging.Logger对象Reset()                                  //全局变量初始化为默认值initgrpclogger() //初始化gRPC Logger,即创建logging.Logger对象,并用这个对象设置grpclog
}
//代码在common/flogging/logging.go

其中func Reset()代码如下。
其作用为:初始化modules和lock,创建一个日志输出对象并设置为默认的日志格式和默认的日志级别。
设置各模块的日志级别,并更新modules。

func Reset() {modules = make(map[string]string) //初始化moduleslock = sync.RWMutex{} //初始化lockdefaultOutput = os.Stderr //默认的日志输出置为os.Stderr//SetFormat()设置并获取go-logging日志格式,InitBackend()创建一个日志输出对象并设置输出格式和日志级别InitBackend(SetFormat(defaultFormat), defaultOutput) InitFromSpec("") //设置各模块日志级别,并更新modules
}
//代码在common/flogging/logging.go

func InitBackend(formatter logging.Formatter, output io.Writer)代码如下。
创建一个日志输出对象并设置输出格式和日志级别。

func InitBackend(formatter logging.Formatter, output io.Writer) {backend := logging.NewLogBackend(output, "", 0) //创建一个日志输出对象backendFormatter := logging.NewBackendFormatter(backend, formatter) //设置日志输出对象的输出格式logging.SetBackend(backendFormatter).SetLevel(defaultLevel, "") //设置日志输出对象的日志级别
}
//代码在common/flogging/logging.go

func InitFromSpec(spec string) string代码如下。
其中spec格式为:[<module>[,<module>...]=]<level>[:[<module>[,<module>...]=]<level>...]。
此处传入spec为"",将""模块日志级别设置为defaultLevel,并会将modules初始化为defaultLevel。

levelAll := defaultLevel //defaultLevel为logging.INFO
var err errorif spec != "" { //如果spec不为空,则按既定格式读取fields := strings.Split(spec, ":") //按:分割for _, field := range fields {split := strings.Split(field, "=") //按=分割switch len(split) {case 1: //只有levelif levelAll, err = logging.LogLevel(field); err != nil { //levelAll赋值为logging.LogLevel枚举中定义的Level级别levelAll = defaultLevel // 如果没有定义,则使用默认日志级别}case 2: //针对module,module...=level,split[0]为模块集,split[1]为要设置的日志级别levelSingle, err := logging.LogLevel(split[1]) //levelSingle赋值为logging.LogLevel枚举中定义的Level级别modules := strings.Split(split[0], ",") //按,分割获取模块名for _, module := range modules {logging.SetLevel(levelSingle, module) //本条规则中所有模块日志级别均设置为levelSingle}default://...}}
}logging.SetLevel(levelAll, "") // 将""模块日志级别设置为levelAll,如果logging.GetLevel(module)没找到时将使用""模块日志级别
for k := range modules {MustGetLogger(k) //获取模块日志级别,并更新modules
}
MustGetLogger(pkgLogID) //pkgLogID及其日志级别,更新至modules
return levelAll.String() //返回levelAll
//代码在common/flogging/logging.go

MustGetLogger会调取go-logging包中GetLevel(),附GetLevel()代码如下。
优先按module获取日志级别,如未找到则按""模块获取日志级别,如仍未找到则默认按DEBUG级别。

func (l *moduleLeveled) GetLevel(module string) Level {level, exists := l.levels[module]if exists == false {level, exists = l.levels[""]if exists == false {level = DEBUG}}return level
}
//代码在github.com/op/go-logging/level.go

3.2、flogging包封装的方法

flogging包封装的方法,如下:

func Reset() //全局变量初始化为默认值
func SetFormat(formatSpec string) logging.Formatter //设置并获取go-logging日志格式
func InitBackend(formatter logging.Formatter, output io.Writer) //创建一个日志输出对象并设置输出格式和日志级别
func DefaultLevel() string //获取defaultLevel
func GetModuleLevel(module string) string //调用logging.GetLevel(module)获取模块日志级别
func SetModuleLevel(moduleRegExp string, level string) (string, error) //包装setModuleLevel
func setModuleLevel(moduleRegExp string, level string, isRegExp bool, revert bool) (string, error) //设置模块日志级别并更新modules
func MustGetLogger(module string) *logging.Logger //创建logging.Logger实例,获取模块日志级别,并更新modules
func InitFromSpec(spec string) string //设置各模块日志级别,并更新modules
func SetPeerStartupModulesMap() //modules内容复制给peerStartModules
func GetPeerStartupLevel(module string) string //从peerStartModules中获取模块日志级别
func RevertToPeerStartupLevels() error //按peerStartModules中内容,设置模块日志级别并更新modules
//代码在common/flogging/logging.go

4、grpclogger实现

grpclogger结构体定义:

type grpclogger struct {logger *logging.Logger
}
//代码在common/flogging/grpclogger.go

grpclogger初始化:

func initgrpclogger() {glogger := MustGetLogger(GRPCModuleID)  //创建logging.Logger对象,获取模块日志级别,并更新modulesgrpclog.SetLogger(&grpclogger{glogger}) //用创建的logging.Logger对象设置grpclog
}
//代码在common/flogging/grpclogger.go

其他方法均为对go-logging的包装,代码如下:

func (g *grpclogger) Fatal(args ...interface{}) {g.logger.Fatal(args...)
}func (g *grpclogger) Fatalf(format string, args ...interface{}) {g.logger.Fatalf(format, args...)
}func (g *grpclogger) Fatalln(args ...interface{}) {g.logger.Fatal(args...)
}// NOTE: grpclog does not support leveled logs so for now use DEBUG
func (g *grpclogger) Print(args ...interface{}) {g.logger.Debug(args...)
}func (g *grpclogger) Printf(format string, args ...interface{}) {g.logger.Debugf(format, args...)
}func (g *grpclogger) Println(args ...interface{}) {g.logger.Debug(args...)
}
//代码在common/flogging/grpclogger.go

转载于:https://blog.51cto.com/14041296/2311243

区块链教程Fabric1.0源代码分析flogging(Fabric日志系统)相关推荐

  1. 兄弟连区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令一

    区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初 ...

  2. 区块链教程Fabric1.0源代码分析scc(系统链码)

    区块链教程Fabric1.0源代码分析scc(系统链码),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更 ...

  3. 区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现

    区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实 ...

  4. 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一

    区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期 ...

  5. 兄弟连区块链教程Fabric1.0源代码分析configupdate处理通道配置更新

    区块链教程Fabric1.0源代码分析configupdate处理通道配置更新,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初 ...

  6. 区块链教程Fabric1.0源代码分析流言算法Gossip服务端二

    区块链教程Fabric1.0源代码分析流言算法Gossip服务端二 Fabric 1.0源代码笔记 之 gossip(流言算法) #GossipServer(Gossip服务端) 5.2.commIm ...

  7. 区块链教程Fabric1.0源代码分析configtx#genesis-兄弟连

    区块链教程Fabric1.0源代码分析configtx#genesis,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的 ...

  8. 区块链教程Fabric1.0源代码分析配置交易-生成通道配置二

    兄弟连区块链教程Fabric1.0源代码分析配置交易-生成通道配置二.Generator接口实现,即bootstrapper. type bootstrapper struct {channelGro ...

  9. gossip 区块链_区块链教程Fabric1.0源代码分析流言算法Gossip服务端一兄弟连区块链教程-阿里云开发者社区...

    区块链教程Fabric1.0源代码分析流言算法Gossip服务端一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退 ...

  10. 区块链教程Fabric1.0源代码gRPC(Fabric中注册的gRPC Service)一

    区块链教程Fabric1.0源代码分析gRPC(Fabric中注册的gRPC Service)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落 ...

最新文章

  1. oracle查询正在执行的语句和kill session
  2. 解读在校园招聘中人工智能常考的笔试题
  3. 一家大型公司的nginx配置
  4. 网络规划设计师考试说明
  5. 思考:日期类型的数据应该用什么样的具体形式存储到数据库?
  6. Vue cli3使用vue-awesome-swiper
  7. iOS 15 地图应用程序的所有新功能:更新的详细信息、AR 步行路线、全球视图等
  8. hdu 1856 求集合里元素的个数 输出最大的个数是多少
  9. Visio图片加全边框
  10. win10家庭中文版计算机,Win10家庭版和专业版有哪些区别?教你区分Win10家庭版和专业版...
  11. Oracle (08)JDBC
  12. I8700手机使用感受
  13. Codeforces Round #101 (Div. 2)
  14. 阿里云交互式分析与Presto对比分析及使用注意事项
  15. OpenCV FLANN匹配器判断重复图像 思路及代码
  16. java使用poi-tl操作word文件
  17. Python 常用模块总结
  18. 首份小程序广告投放价值榜单发布:游戏、工具类小程序占主导地位
  19. java代码在页面实现展示pdf文件
  20. Win10显示dds及tga缩略图

热门文章

  1. 数据类型和Json格式[zt]
  2. Spring Cloud(Greenwich版)-06-Spring Cloud集成Feign
  3. ios Xcode 版本兼容及真机调试
  4. js验证身份证号是否合法
  5. manage key mysql_mysql相关操作
  6. Kibana 自定义索引模式 Index patterns
  7. android alertdialog 自定义时间,Android自定义dialog可选择展示年月日时间选择栏
  8. APK解包修改后,重新打包
  9. OFFICE技术讲座:中文标点符号有哪些
  10. 字写得难看,是什么原因