Browse Source

chore: logger init

tiago.cipriano 4 tháng trước cách đây
mục cha
commit
da9b6771b5
4 tập tin đã thay đổi với 187 bổ sung0 xóa
  1. 1 0
      .tool-versions
  2. 10 0
      go.mod
  3. 16 0
      go.sum
  4. 160 0
      logger.go

+ 1 - 0
.tool-versions

@@ -0,0 +1 @@
+golang 1.24.4

+ 10 - 0
go.mod

@@ -0,0 +1,10 @@
+module go.ti2.net.br/logger
+
+go 1.24.4
+
+require (
+	github.com/caarlos0/env/v11 v11.3.1
+	go.uber.org/zap v1.27.0
+)
+
+require go.uber.org/multierr v1.10.0 // indirect

+ 16 - 0
go.sum

@@ -0,0 +1,16 @@
+github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA=
+github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 160 - 0
logger.go

@@ -0,0 +1,160 @@
+package logger
+
+import (
+	"io"
+	"os"
+	"strings"
+	"sync"
+
+	"github.com/caarlos0/env/v11"
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
+)
+
+type Logger struct {
+	LogLevel       string `env:"LEVEL" envDefault:"INFO"`
+	TraceIDLabel   string `env:"TRACE_ID_LABEL" envDefault:"trace_id"`
+	DateTimeFormat string `env:"DATE_TIME_FORMAT" envDefault:"2006-01-02 15:04:05.000"`
+}
+
+var (
+	once      sync.Once
+	singleton *zap.Logger
+	cfg       Logger
+)
+
+const RequestID = "RequestID"
+
+func init() {
+	cfg = Logger{}
+	if err := env.Parse(&cfg); err != nil {
+		Panic("Problemas ao inicializar a aplicação", zap.Error(err))
+	}
+
+	// once ensures the singleton is initialized only once
+	once.Do(func() {
+		levelType := getLevelLogType(cfg.LogLevel)
+		encoderConfig := getEconderConfig()
+		atom := zap.NewAtomicLevelAt(levelType)
+
+		core := zapcore.NewCore(
+			zapcore.NewJSONEncoder(encoderConfig),
+			zapcore.AddSync(os.Stdout),
+			atom,
+		)
+
+		singleton = zap.New(core, zap.AddCallerSkip(1), zap.AddCaller())
+	})
+}
+
+func SetAppName(appName string) {
+	singleton = singleton.With(zap.String("app", appName))
+}
+
+func ChangeWriteSyncer(recurso io.Writer) {
+	singleton = singleton.WithOptions(
+		zap.WrapCore(
+			func(zapcore.Core) zapcore.Core {
+				return zapcore.NewCore(zapcore.NewJSONEncoder(getEconderConfig()),
+					zapcore.AddSync(recurso),
+					zap.NewAtomicLevelAt(zap.DebugLevel))
+			}))
+}
+
+func ChangeLogLevel(level string) {
+	levelType := getLevelLogType(level)
+	singleton = singleton.WithOptions(
+		zap.WrapCore(
+			func(zapcore.Core) zapcore.Core {
+				return zapcore.NewCore(zapcore.NewJSONEncoder(getEconderConfig()),
+					zapcore.AddSync(os.Stdout),
+					zap.NewAtomicLevelAt(levelType))
+			}))
+}
+
+func getLevelLogType(entrada string) zapcore.Level {
+	entrada = strings.TrimSpace(entrada)
+	switch strings.ToUpper(entrada) {
+	case "INFO":
+		return zap.InfoLevel
+	case "DEBUG":
+		return zap.DebugLevel
+	case "ERROR":
+		return zap.ErrorLevel
+	case "WARN":
+		return zap.WarnLevel
+	case "PANIC":
+		return zap.PanicLevel
+	case "DPANIC":
+		return zap.DPanicLevel
+	case "FATAL":
+		return zap.FatalLevel
+	default:
+		return zap.InfoLevel
+	}
+}
+
+func getEconderConfig() zapcore.EncoderConfig {
+	return zapcore.EncoderConfig{
+		MessageKey:    "msg",
+		TimeKey:       "time",
+		LevelKey:      "level",
+		NameKey:       "logger",
+		CallerKey:     "caller",
+		StacktraceKey: "stacktrace",
+		FunctionKey:   "func",
+		LineEnding:    zapcore.DefaultLineEnding,
+		EncodeLevel:   zapcore.CapitalLevelEncoder,
+		// EncodeTime:    zapcore.ISO8601TimeEncoder,
+		EncodeTime: zapcore.TimeEncoderOfLayout(cfg.DateTimeFormat),
+		// EncodeDuration: zapcore.SecondsDurationEncoder,
+		EncodeDuration: zapcore.StringDurationEncoder,
+		EncodeCaller:   zapcore.ShortCallerEncoder,
+		// EncodeCaller: zapcore.FullCallerEncoder,
+	}
+}
+
+// Debug logs a debug message with the given fields
+func Debug(message string, fields ...zap.Field) {
+	singleton.Debug(message, fields...)
+}
+
+// Info logs a debug message with the given fields
+func Info(message string, fields ...zap.Field) {
+	singleton.Info(message, fields...)
+}
+
+func Printf(format string, args ...interface{}) {
+	singleton.Sugar().Infof(format, args...)
+}
+
+// Warn logs a debug message with the given fields
+func Warn(message string, fields ...zap.Field) {
+	singleton.Warn(message, fields...)
+}
+
+// Error logs a debug message with the given fields
+func Error(message string, fields ...zap.Field) {
+	singleton.Error(message, fields...)
+}
+
+// Fatal logs a message than calls os.Exit(1)
+func Fatal(message string, fields ...zap.Field) {
+	singleton.Fatal(message, fields...)
+}
+
+func Panic(message string, fields ...zap.Field) {
+	singleton.Panic(message, fields...)
+}
+
+func DPanic(message string, fields ...zap.Field) {
+	singleton.DPanic(message, fields...)
+}
+
+func GetInstance() *zap.Logger {
+	return singleton
+}
+
+func TraceID(traceID string) zap.Field {
+	return zap.String(cfg.TraceIDLabel, traceID)
+}