func NewLogger()

in pkg/log/logger.go [219:290]


func NewLogger(opts ...Option) (*Logger, error) {
	var (
		writer zapcore.WriteSyncer
		enc    zapcore.Encoder
	)

	o := &options{
		logLevel:   "warn",
		outputFile: "stderr",
	}
	for _, opt := range opts {
		opt.apply(o)
	}

	level, ok := levelMap[o.logLevel]
	if !ok {
		return nil, fmt.Errorf("unknown log level %s", o.logLevel)
	}

	logger := &Logger{
		level: level,
	}

	if o.writeSyncer != nil {
		writer = o.writeSyncer
	} else {
		if o.outputFile == "stdout" {
			writer = os.Stdout
		} else if o.outputFile == "stderr" {
			writer = os.Stderr
		} else {
			file, err := os.OpenFile(o.outputFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
			if err != nil {
				return nil, err
			}
			writer = file
		}
	}

	if writer == os.Stdout || writer == os.Stderr {
		enc = zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
			MessageKey:     "message",
			LevelKey:       "level",
			TimeKey:        "time",
			NameKey:        "context",
			CallerKey:      "caller",
			StacktraceKey:  "backtrace",
			LineEnding:     zapcore.DefaultLineEnding,
			EncodeLevel:    zapcore.LowercaseColorLevelEncoder,
			EncodeTime:     zapcore.RFC3339TimeEncoder,
			EncodeDuration: zapcore.StringDurationEncoder,
			EncodeCaller:   zapcore.ShortCallerEncoder,
		})
	} else {
		enc = zapcore.NewJSONEncoder(zapcore.EncoderConfig{
			MessageKey:     "message",
			LevelKey:       "level",
			TimeKey:        "time",
			NameKey:        "context",
			CallerKey:      "caller",
			StacktraceKey:  "backtrace",
			LineEnding:     zapcore.DefaultLineEnding,
			EncodeLevel:    zapcore.LowercaseLevelEncoder,
			EncodeTime:     zapcore.RFC3339NanoTimeEncoder,
			EncodeDuration: zapcore.StringDurationEncoder,
			EncodeCaller:   zapcore.ShortCallerEncoder,
		})
	}
	logger.writer = writer
	logger.core = zapcore.NewCore(enc, writer, level)
	return logger, nil
}