package config import ( "io" "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func NewLogger(version Version, output io.Writer, args []string) (*zap.Logger, func()) { parsedCliArgs, _ := ParseArgs(version, os.Exit, args) syncs := []zapcore.WriteSyncer{zapcore.AddSync(output)} encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.RFC3339NanoTimeEncoder core := zapcore.NewCore( zapcore.NewJSONEncoder(encoderConfig), zap.CombineWriteSyncers(syncs...), zap.DebugLevel, ) logger := zap.New(core).WithOptions( zap.AddStacktrace(zap.ErrorLevel), zap.WithCaller(false), ).With( zap.String("version", version.Release), zap.String("environment", *parsedCliArgs.Environment), ) finalizer := func() { // This might fail if logging to console, but we don't care (https://github.com/uber-go/zap/issues/880) _ = logger.Sync() } return logger, finalizer }