diff --git a/Gopkg.lock b/Gopkg.lock index 83a48b790..0ea1a100a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -452,7 +452,7 @@ version = "v1.1.0" [[projects]] - digest = "1:676160e6a4722b08e0e26b11521d575c2cb2b6f0c679e1ee6178c5d8dee51e5e" + digest = "1:ecd62b854fc2a3c6583720380e8518730a4f45ffe878a0f9628f0e2454faacf6" name = "go.uber.org/zap" packages = [ ".", @@ -461,6 +461,7 @@ "internal/color", "internal/exit", "zapcore", + "zapgrpc", ] pruneopts = "UT" revision = "27376062155ad36be76b0f12cf1572a221d3a48c" @@ -709,6 +710,7 @@ "github.com/titpetric/factory/resputil", "go.uber.org/zap", "go.uber.org/zap/zapcore", + "go.uber.org/zap/zapgrpc", "golang.org/x/crypto/bcrypt", "golang.org/x/crypto/ssh/terminal", "google.golang.org/grpc", diff --git a/compose/internal/service/script_runner.go b/compose/internal/service/script_runner.go index 037e44b12..79281ebce 100644 --- a/compose/internal/service/script_runner.go +++ b/compose/internal/service/script_runner.go @@ -3,10 +3,10 @@ package service import ( "context" "errors" - "os" "time" "go.uber.org/zap" + "go.uber.org/zap/zapgrpc" "google.golang.org/grpc" "google.golang.org/grpc/grpclog" @@ -60,8 +60,12 @@ func ScriptRunner(c options.ScriptRunnerOpt) (*scriptRunner, error) { } func (svc *scriptRunner) connect() (err error) { - // @todo wire grpc logger with zap logger - grpclog.SetLoggerV2(grpclog.NewLoggerV2WithVerbosity(os.Stdout, os.Stdout, os.Stdout, 0)) + if svc.c.Log { + // Send logs to zap + // + // waiting for https://github.com/uber-go/zap/pull/538 + grpclog.SetLogger(zapgrpc.NewLogger(svc.logger.Named("grpc"))) + } var dopts = []grpc.DialOption{ // @todo insecure? diff --git a/pkg/cli/options/script_runner.go b/pkg/cli/options/script_runner.go index 572560ac0..1b28b134e 100644 --- a/pkg/cli/options/script_runner.go +++ b/pkg/cli/options/script_runner.go @@ -8,6 +8,7 @@ type ( ScriptRunnerOpt struct { Addr string `env:"SCRIPT_RUNNER_ADDR"` MaxBackoffDelay time.Duration `env:"SCRIPT_RUNNER_MAX_BACKOFF_DELAY"` + Log bool `env:"SCRIPT_RUNNER_LOG"` } ) @@ -15,6 +16,7 @@ func ScriptRunner(pfix string) (o *ScriptRunnerOpt) { o = &ScriptRunnerOpt{ Addr: "corredor:80", MaxBackoffDelay: time.Minute, + Log: false, } fill(o, pfix) diff --git a/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go b/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go new file mode 100644 index 000000000..1181e6a0d --- /dev/null +++ b/vendor/go.uber.org/zap/zapgrpc/zapgrpc.go @@ -0,0 +1,100 @@ +// 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...) +}