摘要:區塊鏈教程源代碼分析日志系統,年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁回歸理性,表面上看相關人才需求與身價似乎正在回落。源代碼筆記之日志系統概述,即,對第三方日志包做了封裝,供全局使用。設置各模塊的日志級別,并更新。
區塊鏈教程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.go3、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) //初始化modules ????lock = sync.RWMutex{} //初始化lock ????defaultOutput = 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格式為:[
此處傳入spec為"",將""模塊日志級別設置為defaultLevel,并會將modules初始化為defaultLevel。
levelAll := defaultLevel //defaultLevel為logging.INFO var err error if spec != "" { //如果spec不為空,則按既定格式讀取 ????fields := strings.Split(spec, ":") //按:分割 ????for _, field := range fields { ????????split := strings.Split(field, "=") //按=分割 ????????switch len(split) { ????????case 1: //只有level ????????????if 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.go3.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.go4、grpclogger實現
grpclogger結構體定義:
type grpclogger struct { ????logger *logging.Logger } //代碼在common/flogging/grpclogger.go
grpclogger初始化:
func initgrpclogger() { ????glogger := MustGetLogger(GRPCModuleID) //創建logging.Logger對象,獲取模塊日志級別,并更新modules ????grpclog.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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24350.html
摘要:區塊鏈教程源代碼分析根命令入口及加載子命令,年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁回歸理性,表面上看相關人才需求與身價似乎正在回落。代碼在為命令啟動。 區塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的...
摘要:兄弟連區塊鏈教程源代碼分析根命令入口及加載子命令二。此處傳入為,將模塊日志級別設置為,并會將初始化為。代碼在目錄下包括。核心代碼為,目的是在或為空時設置默認值。感謝關注兄弟連區塊鏈教程分享 兄弟連區塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令二。flogging,即:fabric logging,為Fabric基于第三方包go-logging封裝的日...
摘要:兄弟連區塊鏈教程源代碼分析客戶端,年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁回歸理性,表面上看相關人才需求與身價似乎正在回落。源代碼筆記之客戶端概述相關代碼分布如下,接口及實現。代碼在工具函數獲取客戶端代碼在 兄弟連區塊鏈教程Fabric1.0源代碼分析Peer EndorserClient(Endorser客戶端),2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性...
摘要:兄弟連區塊鏈教程源代碼分析服務端,年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁回歸理性,表面上看相關人才需求與身價似乎正在回落。源代碼筆記之服務端概述相關代碼在目錄下。,接口實現,即結構體及方法,以及服務端處理流程。 兄弟連區塊鏈教程Fabric1.0源代碼分析Peer(Endorser服務端),2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與...
摘要:兄弟連區塊鏈教程源代碼分析命令及子命令實現,年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁回歸理性,表面上看相關人才需求與身價似乎正在回落。 兄弟連區塊鏈教程Fabric1.0源代碼分析Peer peer chaincode命令及子命令實現,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多...
閱讀 3274·2021-11-23 09:51
閱讀 939·2021-09-03 10:30
閱讀 3212·2021-08-31 09:40
閱讀 3278·2019-08-30 14:22
閱讀 902·2019-08-30 14:09
閱讀 2900·2019-08-30 13:21
閱讀 3232·2019-08-28 18:03
閱讀 2859·2019-08-26 13:44