package logging import ( "fmt" "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // NewLogger returns a zap sugared logger configured with json format and caller id func NewLogger(logLevel string) (*zap.SugaredLogger, error) { level := zap.NewAtomicLevelAt(zapcore.InfoLevel) switch logLevel { case "debug": level = zap.NewAtomicLevelAt(zapcore.DebugLevel) case "info": level = zap.NewAtomicLevelAt(zapcore.InfoLevel) case "warn": level = zap.NewAtomicLevelAt(zapcore.WarnLevel) case "error": level = zap.NewAtomicLevelAt(zapcore.ErrorLevel) case "fatal": level = zap.NewAtomicLevelAt(zapcore.FatalLevel) case "panic": level = zap.NewAtomicLevelAt(zapcore.PanicLevel) } zapEncoderConfig := zapcore.EncoderConfig{ TimeKey: "ts", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.LowercaseLevelEncoder, EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } zapConfig := zap.Config{ Level: level, Development: false, Sampling: &zap.SamplingConfig{ Initial: 100, Thereafter: 100, }, Encoding: "json", EncoderConfig: zapEncoderConfig, OutputPaths: []string{"stderr"}, ErrorOutputPaths: []string{"stderr"}, } logger, err := zapConfig.Build() if err != nil { return nil, err } return logger.Sugar(), nil } // Console writes to stdout if the console env var exists func Console(a ...interface{}) (n int, err error) { if os.Getenv("console") != "" { return fmt.Fprintln(os.Stdout, a...) } return 0, nil }