package logger import ( "os" "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) var Logger zerolog.Logger func Init(serviceName, level string) { zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMs zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string { short := file for i := len(file) - 1; i > 0; i-- { if file[i] == '/' { short = file[i+1:] break } } return short + ":" + string(rune(line)) } output := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339, NoColor: false} logger := zerolog.New(output).With().Timestamp().Caller().Str("service", serviceName).Logger() switch level { case "debug": logger = logger.Level(zerolog.DebugLevel) case "info": logger = logger.Level(zerolog.InfoLevel) case "warn": logger = logger.Level(zerolog.WarnLevel) case "error": logger = logger.Level(zerolog.ErrorLevel) default: logger = logger.Level(zerolog.InfoLevel) } Logger = logger log.Logger = logger } func GetLogger() zerolog.Logger { return Logger } func WithRequestID(requestID string) zerolog.Logger { return Logger.With().Str("request_id", requestID).Logger() } func WithFields(fields map[string]interface{}) zerolog.Logger { ctx := Logger.With() for k, v := range fields { ctx = ctx.Interface(k, v) } return ctx.Logger() }