| // Copyright (c) 2016 Uber Technologies, Inc. |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a copy |
| // of this software and associated documentation files (the "Software"), to deal |
| // in the Software without restriction, including without limitation the rights |
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| // copies of the Software, and to permit persons to whom the Software is |
| // furnished to do so, subject to the following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included in |
| // all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| // THE SOFTWARE. |
| |
| // Package zapgrpc provides a logger that is compatible with grpclog. |
| package zapgrpc // import "go.uber.org/zap/zapgrpc" |
| |
| import "go.uber.org/zap" |
| |
| // An Option overrides a Logger's default configuration. |
| type Option interface { |
| apply(*Logger) |
| } |
| |
| type optionFunc func(*Logger) |
| |
| func (f optionFunc) apply(log *Logger) { |
| f(log) |
| } |
| |
| // WithDebug configures a Logger to print at zap's DebugLevel instead of |
| // InfoLevel. |
| func WithDebug() Option { |
| return optionFunc(func(logger *Logger) { |
| logger.print = (*zap.SugaredLogger).Debug |
| logger.printf = (*zap.SugaredLogger).Debugf |
| }) |
| } |
| |
| // NewLogger returns a new Logger. |
| // |
| // By default, Loggers print at zap's InfoLevel. |
| func NewLogger(l *zap.Logger, options ...Option) *Logger { |
| logger := &Logger{ |
| log: l.Sugar(), |
| fatal: (*zap.SugaredLogger).Fatal, |
| fatalf: (*zap.SugaredLogger).Fatalf, |
| print: (*zap.SugaredLogger).Info, |
| printf: (*zap.SugaredLogger).Infof, |
| } |
| for _, option := range options { |
| option.apply(logger) |
| } |
| return logger |
| } |
| |
| // Logger adapts zap's Logger to be compatible with grpclog.Logger. |
| type Logger struct { |
| log *zap.SugaredLogger |
| fatal func(*zap.SugaredLogger, ...interface{}) |
| fatalf func(*zap.SugaredLogger, string, ...interface{}) |
| print func(*zap.SugaredLogger, ...interface{}) |
| printf func(*zap.SugaredLogger, string, ...interface{}) |
| } |
| |
| // Fatal implements grpclog.Logger. |
| func (l *Logger) Fatal(args ...interface{}) { |
| l.fatal(l.log, args...) |
| } |
| |
| // Fatalf implements grpclog.Logger. |
| func (l *Logger) Fatalf(format string, args ...interface{}) { |
| l.fatalf(l.log, format, args...) |
| } |
| |
| // Fatalln implements grpclog.Logger. |
| func (l *Logger) Fatalln(args ...interface{}) { |
| l.fatal(l.log, args...) |
| } |
| |
| // Print implements grpclog.Logger. |
| func (l *Logger) Print(args ...interface{}) { |
| l.print(l.log, args...) |
| } |
| |
| // Printf implements grpclog.Logger. |
| func (l *Logger) Printf(format string, args ...interface{}) { |
| l.printf(l.log, format, args...) |
| } |
| |
| // Println implements grpclog.Logger. |
| func (l *Logger) Println(args ...interface{}) { |
| l.print(l.log, args...) |
| } |