Untitled

 avatar
unknown
golang
a year ago
2.6 kB
9
Indexable
package pkg

import (
	"os"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func CreateLogger(level, format string) *zap.Logger {
	// Выбираем, куда писать логи - в stdout или stderr.
	// Для общего логгера подойдет stdout
	stdout := zapcore.AddSync(os.Stdout)

	// Создаем из zap стандартную конфигурацию,
	// production это info-уровень, есть еще dev - там debug
	cfg := zap.NewProductionEncoderConfig()

	// zap проставляет сам несколько параметров при логировании
	// Здесь мы указываем, с каким заголовком эти поля писать
	cfg.TimeKey = "ts"
	cfg.CallerKey = "caller"
	cfg.LevelKey = "level"
	cfg.MessageKey = "msg"

	// Здесь мы ставим, как выводить уровент (выделять цветом + писать капсом)
	cfg.EncodeLevel = zapcore.CapitalColorLevelEncoder
	// Здесь как писать время: можно unix.Timestamp, мы пишем в удобоваримом варианте
	cfg.EncodeTime = zapcore.ISO8601TimeEncoder

	logLevel := setLevel(level)
	// Создаем энкодер здесь (см. функцию)
	encoder := createEncoder(cfg, format)

	// Здесь объединяем все логгеры в один
	// Может быть много core, например, один пишет в stdout для людей, другой - в файл для роботов.
	core := zapcore.NewTee(
		zapcore.NewCore(encoder, stdout, logLevel),
	)

	// Создаем итоговый логгер
	return zap.New(core)
}

// Здесь на основе текстового параметра создаем уровень логирования
func setLevel(logLevel string) (level zapcore.Level) {
	switch logLevel {
	case "debug":
		level = zapcore.DebugLevel
	case "info":
		level = zapcore.InfoLevel
	case "warn":
		level = zapcore.WarnLevel
	case "error":
		level = zapcore.ErrorLevel
	case "fatal":
		level = zapcore.FatalLevel
	default:
		level = zapcore.InfoLevel
	}

	return
}

// Здесь создаем энкодер
// Если текстовый, то пишет понятно человеку, если json - пишет в json-формате.
func createEncoder(cfg zapcore.EncoderConfig, format string) (enc zapcore.Encoder) {
	switch format {
	case "text":
		enc = zapcore.NewConsoleEncoder(cfg)
	case "json":
		enc = zapcore.NewJSONEncoder(cfg)
	default:
		enc = zapcore.NewConsoleEncoder(cfg)
	}

	return
}
Editor is loading...
Leave a Comment