fabricソース解析3——ログシステム

3703 ワード

fabricソース解析3——ログシステム
ここでいうログとは、fabric記録取引データ、帳簿データなどの取引ログではなく、プログラム実行中に端末やログファイルに印刷され、プログラム実行中のログを記録することを意味する.実はログシステムのメカニズムはソースコードの研究に対して無視することができて、しかも相対的に簡単で、しかし一方でログシステムはプログラムの運行とデバッグに対して必ず少なくなくて、fabricはどのようにこのログシステムを形成して学習することができて、ログの印刷した内容はソースコードを読むことに対して1種の提案です;一方、このログを明らかにしないで、ソースコードを読む過程であちこちに現れた印刷ログは、ソースコードの上にいる蚊のように、心を騒がせています.
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")

もっと詳しい使い方はgo docやライブラリで自分で勉強してください.
flogging
floggingディレクトリの下に2つのファイルがありますgrpclogger.goとlogging.go.
grpclogger.goはgrpcのログを設定するために使用されます.grpcのデフォルトはgo言語の標準ログインタフェースだけであるため、loggingをgo言語の標準ログ形式の構造type grpclogger struct{logger*logging.Logger}にカプセル化し、initgrpclogger()によってgrpc用のオブジェクトを生成し、grpcにもfloggingを使用させる効果を実現します.
logging.goファイルにはfloggingというログ記録者loggerが付属しており、デフォルトのログフォーマット、ログレベルが規定されており、defaultFormat、defaultLevel定数で表されています.デフォルトの出力端子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自身の使用要件に合致する目的を達成するために,万変不離の宗と言える.