日誌主要用於跟蹤服務的運行信息,做爲後端攻城獅,通常都會有一種想法,平時的時候但願日誌越少越好,出問題的時候又老是抱怨,怎麼才tmd這點日誌,還在關鍵的地方沒打印.git
所以,日誌很重要,將日誌進行格式化也很重要,日誌格式化主要是爲了方便後續進行分析.如經過將錯誤碼格式化到日誌中,咱們能夠對收集後的日誌分析接口的調用健康狀態,將接口耗時格式化後上報,能夠監控延時高的操做,並查詢出關聯日誌進行分析.github
因此只要是格式化輸出,很容易有不少應用.json
這裏主要是兩方面,每次操做的耗時,以及每次操做分配的內存,做爲日誌庫,兩個指標都應該要極低.後端
能經過調節日誌等級打印不一樣級別的日誌.app
可以設置採樣率,防止服務請求增長時輸出的日誌量劇增,從而影響服務性能.性能
自動按必定大小切分文件,按期歸檔,保存必定數量文件.spa
基於以上幾點,選擇uber開源的日誌庫 zap.日誌
grpc 定義了grpclog包,並定義了LoggerV2的接口,所以,只要經過zap實現LoggerV2的接口,並經過SetLoggerV2(l LoggerV2)接口將實現的對象設置到grpclog包中,那麼grpc將使用zap進行日誌輸出,同時上層應用也能夠使用grpclog進行業務日誌打印.code
完整代碼以及使用示例見 grpc-wrapperorm
type ZapLogger struct { logger *zap.Logger } //建立封裝了zap的對象,該對象是對LoggerV2接口的實現 func NewZapLogger(logger *zap.Logger) *ZapLogger { return &ZapLogger{ logger: logger, } } func (zl *ZapLogger) Info(args ...interface{}) { zl.logger.Sugar().Info(args...) } func (zl *ZapLogger) Infoln(args ...interface{}) { zl.logger.Sugar().Info(args...) } func (zl *ZapLogger) Infof(format string, args ...interface{}) { zl.logger.Sugar().Infof(format, args...) } func (zl *ZapLogger) Warning(args ...interface{}) { zl.logger.Sugar().Warn(args...) } func (zl *ZapLogger) Warningln(args ...interface{}) { zl.logger.Sugar().Warn(args...) } func (zl *ZapLogger) Warningf(format string, args ...interface{}) { zl.logger.Sugar().Warnf(format, args...) } func (zl *ZapLogger) Error(args ...interface{}) { zl.logger.Sugar().Error(args...) } func (zl *ZapLogger) Errorln(args ...interface{}) { zl.logger.Sugar().Error(args...) } func (zl *ZapLogger) Errorf(format string, args ...interface{}) { zl.logger.Sugar().Errorf(format, args...) } func (zl *ZapLogger) Fatal(args ...interface{}) { zl.logger.Sugar().Fatal(args...) } func (zl *ZapLogger) Fatalln(args ...interface{}) { zl.logger.Sugar().Fatal(args...) } // Fatalf logs to fatal level func (zl *ZapLogger) Fatalf(format string, args ...interface{}) { zl.logger.Sugar().Fatalf(format, args...) } // V reports whether verbosity level l is at least the requested verbose level. func (zl *ZapLogger) V(v int) bool { return false }
能夠看到,日誌以json格式輸出,並顯示了日誌打印時的代碼行數,同時當出現error時進行了調用棧的追蹤.