成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

區(qū)塊鏈教程Fabric1.0源代碼分析flogging(Fabric日志系統(tǒng))兄弟連區(qū)塊鏈

DandJ / 3017人閱讀

摘要:區(qū)塊鏈教程源代碼分析日志系統(tǒng),年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。源代碼筆記之日志系統(tǒng)概述,即,對(duì)第三方日志包做了封裝,供全局使用。設(shè)置各模塊的日志級(jí)別,并更新。

  區(qū)塊鏈教程Fabric1.0源代碼分析flogging(Fabric日志系統(tǒng)),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多的關(guān)注點(diǎn)放在了區(qū)塊鏈真正的技術(shù)之上。

Fabric 1.0源代碼筆記 之 flogging(Fabric日志系統(tǒng)) 1、flogging概述

flogging,即fabric logging,對(duì)第三方日志包go-logging做了封裝,供全局使用。go-logging地址:https://github.com/op/go-logging。
flogging代碼集中在common/flogging目錄下,包括logging.go和grpclogger.go。

logging.go,定義了默認(rèn)的日志格式、日志級(jí)別和日志輸出,以及modules和peerStartModules做模塊和日志級(jí)別的映射。并定義了若干對(duì)go-logging封裝的函數(shù)。

grpclogger.go,基于封裝go-logging定義了結(jié)構(gòu)體grpclogger及其方法,并用于設(shè)置grpclog。grpclog默認(rèn)使用go標(biāo)準(zhǔn)庫(kù)日志包,此舉可使得grpclog也使用go-logging和flogging功能。

2、flogging的常量和全局變量

涉及常量:pkgLogID、defaultFormat和defaultLevel,分別表示僅在flogging包內(nèi)代碼使用的go-logging名稱、默認(rèn)的日志格式和默認(rèn)的日志級(jí)別。

涉及全局變量如下:

var (
????logger *logging.Logger //僅在flogging包內(nèi)代碼使用的logging.Logger對(duì)象
????defaultOutput *os.File //默認(rèn)的日志輸出
????modules          map[string]string //保存所有模塊及其各自的日志級(jí)別的映射
????peerStartModules map[string]string //存儲(chǔ)內(nèi)容與modules相同
????lock sync.RWMutex //RWMutex讀寫鎖
????once sync.Once    //對(duì)于從全局的角度只需要運(yùn)行一次的代碼,比如全局初化操始作,go語(yǔ)言提供了一個(gè)Once類型來(lái)保證全局的唯一性操作
)
//代碼在common/flogging/logging.go
3、flogging對(duì)go-logging的封裝 3.1、flogging包初始化

flogging包初始化,即init()函數(shù),代碼如下:

func init() {
????logger = logging.MustGetLogger(pkgLogID) //創(chuàng)建僅在flogging包內(nèi)代碼使用的logging.Logger對(duì)象
????Reset()                                  //全局變量初始化為默認(rèn)值
????initgrpclogger() //初始化gRPC Logger,即創(chuàng)建logging.Logger對(duì)象,并用這個(gè)對(duì)象設(shè)置grpclog
}
//代碼在common/flogging/logging.go

其中func Reset()代碼如下。
其作用為:初始化modules和lock,創(chuàng)建一個(gè)日志輸出對(duì)象并設(shè)置為默認(rèn)的日志格式和默認(rèn)的日志級(jí)別。
設(shè)置各模塊的日志級(jí)別,并更新modules。

func Reset() {
????modules = make(map[string]string) //初始化modules
????lock = sync.RWMutex{} //初始化lock
????defaultOutput = os.Stderr //默認(rèn)的日志輸出置為os.Stderr
????//SetFormat()設(shè)置并獲取go-logging日志格式,InitBackend()創(chuàng)建一個(gè)日志輸出對(duì)象并設(shè)置輸出格式和日志級(jí)別
????InitBackend(SetFormat(defaultFormat), defaultOutput) 
????InitFromSpec("") //設(shè)置各模塊日志級(jí)別,并更新modules
}
//代碼在common/flogging/logging.go

func InitBackend(formatter logging.Formatter, output io.Writer)代碼如下。
創(chuàng)建一個(gè)日志輸出對(duì)象并設(shè)置輸出格式和日志級(jí)別。

func InitBackend(formatter logging.Formatter, output io.Writer) {
????backend := logging.NewLogBackend(output, "", 0) //創(chuàng)建一個(gè)日志輸出對(duì)象
????backendFormatter := logging.NewBackendFormatter(backend, formatter) //設(shè)置日志輸出對(duì)象的輸出格式
????logging.SetBackend(backendFormatter).SetLevel(defaultLevel, "") //設(shè)置日志輸出對(duì)象的日志級(jí)別
}
//代碼在common/flogging/logging.go

func InitFromSpec(spec string) string代碼如下。
其中spec格式為:[[,...]=][:[[,...]=]...]。
此處傳入spec為"",將""模塊日志級(jí)別設(shè)置為defaultLevel,并會(huì)將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: //只有l(wèi)evel
????????????if levelAll, err = logging.LogLevel(field); err != nil { //levelAll賦值為logging.LogLevel枚舉中定義的Level級(jí)別
????????????????levelAll = defaultLevel // 如果沒(méi)有定義,則使用默認(rèn)日志級(jí)別
????????????}
????????case 2: //針對(duì)module,module...=level,split[0]為模塊集,split[1]為要設(shè)置的日志級(jí)別
????????????levelSingle, err := logging.LogLevel(split[1]) //levelSingle賦值為logging.LogLevel枚舉中定義的Level級(jí)別
????????????modules := strings.Split(split[0], ",") //按,分割獲取模塊名
????????????for _, module := range modules {
????????????????logging.SetLevel(levelSingle, module) //本條規(guī)則中所有模塊日志級(jí)別均設(shè)置為levelSingle
????????????}
????????default:
????????????//...
????????}
????}
}

logging.SetLevel(levelAll, "") // 將""模塊日志級(jí)別設(shè)置為levelAll,如果logging.GetLevel(module)沒(méi)找到時(shí)將使用""模塊日志級(jí)別
for k := range modules {
????MustGetLogger(k) //獲取模塊日志級(jí)別,并更新modules
}
MustGetLogger(pkgLogID) //pkgLogID及其日志級(jí)別,更新至modules
return levelAll.String() //返回levelAll
//代碼在common/flogging/logging.go

MustGetLogger會(huì)調(diào)取go-logging包中GetLevel(),附GetLevel()代碼如下。
優(yōu)先按module獲取日志級(jí)別,如未找到則按""模塊獲取日志級(jí)別,如仍未找到則默認(rèn)按DEBUG級(jí)別。

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() //全局變量初始化為默認(rèn)值
func SetFormat(formatSpec string) logging.Formatter //設(shè)置并獲取go-logging日志格式
func InitBackend(formatter logging.Formatter, output io.Writer) //創(chuàng)建一個(gè)日志輸出對(duì)象并設(shè)置輸出格式和日志級(jí)別
func DefaultLevel() string //獲取defaultLevel
func GetModuleLevel(module string) string //調(diào)用logging.GetLevel(module)獲取模塊日志級(jí)別
func SetModuleLevel(moduleRegExp string, level string) (string, error) //包裝setModuleLevel
func setModuleLevel(moduleRegExp string, level string, isRegExp bool, revert bool) (string, error) //設(shè)置模塊日志級(jí)別并更新modules
func MustGetLogger(module string) *logging.Logger //創(chuàng)建logging.Logger實(shí)例,獲取模塊日志級(jí)別,并更新modules
func InitFromSpec(spec string) string //設(shè)置各模塊日志級(jí)別,并更新modules
func SetPeerStartupModulesMap() //modules內(nèi)容復(fù)制給peerStartModules
func GetPeerStartupLevel(module string) string //從peerStartModules中獲取模塊日志級(jí)別
func RevertToPeerStartupLevels() error //按peerStartModules中內(nèi)容,設(shè)置模塊日志級(jí)別并更新modules
//代碼在common/flogging/logging.go
4、grpclogger實(shí)現(xiàn)

grpclogger結(jié)構(gòu)體定義:

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

grpclogger初始化:

func initgrpclogger() {
????glogger := MustGetLogger(GRPCModuleID)  //創(chuàng)建logging.Logger對(duì)象,獲取模塊日志級(jí)別,并更新modules
????grpclog.SetLogger(&grpclogger{glogger}) //用創(chuàng)建的logging.Logger對(duì)象設(shè)置grpclog
}
//代碼在common/flogging/grpclogger.go

其他方法均為對(duì)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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24350.html

相關(guān)文章

  • 兄弟區(qū)塊教程Fabric1.0代碼分析Peer peer根命令入口及加載子命令一

    摘要:區(qū)塊鏈教程源代碼分析根命令入口及加載子命令,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。代碼在為命令啟動(dòng)。   區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令,2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多的...

    sean 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer peer根命令入口及加載子命令二

    摘要:兄弟連區(qū)塊鏈教程源代碼分析根命令入口及加載子命令二。此處傳入為,將模塊日志級(jí)別設(shè)置為,并會(huì)將初始化為。代碼在目錄下包括。核心代碼為,目的是在或?yàn)榭諘r(shí)設(shè)置默認(rèn)值。感謝關(guān)注兄弟連區(qū)塊鏈教程分享   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令二。flogging,即:fabric logging,為Fabric基于第三方包go-logging封裝的日...

    tuantuan 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer EndorserClient(Endorser客戶端

    摘要:兄弟連區(qū)塊鏈教程源代碼分析客戶端,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。源代碼筆記之客戶端概述相關(guān)代碼分布如下,接口及實(shí)現(xiàn)。代碼在工具函數(shù)獲取客戶端代碼在   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer EndorserClient(Endorser客戶端),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性...

    lufficc 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer(Endorser服務(wù)端)

    摘要:兄弟連區(qū)塊鏈教程源代碼分析服務(wù)端,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。源代碼筆記之服務(wù)端概述相關(guān)代碼在目錄下。,接口實(shí)現(xiàn),即結(jié)構(gòu)體及方法,以及服務(wù)端處理流程。   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer(Endorser服務(wù)端),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與...

    leone 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer peer chaincode命令及子命令實(shí)現(xiàn)

    摘要:兄弟連區(qū)塊鏈教程源代碼分析命令及子命令實(shí)現(xiàn),年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer chaincode命令及子命令實(shí)現(xiàn),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多...

    gghyoo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<