logger

package
v0.0.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 29, 2026 License: MIT Imports: 12 Imported by: 0

README

Logger

Logger profesional y completo para aplicaciones Go con soporte para múltiples destinos, niveles configurables y logging estructurado.

Diseñado para ser global, concurrente y listo para producción, con integración avanzada para Gin.


✨ Características

  • 🎯 Múltiples destinos: Consola, archivos, base de datos
  • 📊 Niveles configurables: Debug, Info, Warn, Error, Fatal, Security, Off
  • 🏷️ Logging estructurado: Campos adicionales y contexto
  • 🔒 Thread-safe: Seguro para uso concurrente
  • 🎨 Colores en consola: Output legible y atractivo
  • 🌐 Contexto por request: request_id, IP, método, path, user_agent
  • 🔌 Integración Gin avanzada: Middleware, recovery y helpers
  • ♻️ Backward compatible: API legacy soportada
  • Batch writing: Escritura eficiente a base de datos
  • 🧩 Logger global: Consistente en toda la aplicación

📦 Instalación

go get github.com/AndresGT/gokit/logger

🚀 Uso Rápido

Inicializar Logger Global (recomendado)
import "github.com/AndresGT/gokit/logger"

func main() {
	log := logger.InitGlobal(logger.Config{
		MinLevel:     logger.DebugLevel,
		EnableColors: true,
	})

	defer log.Close()

	logger.Info("Servidor iniciado")
}

Uso Básico
logger.Debug("Variable x = %v", x)
logger.Info("Servidor iniciando...")
logger.Success("Conexión exitosa")
logger.Warn("Cache no disponible")
logger.Error("Error: %v", err)
logger.Fatal("Error crítico")
logger.Security("Login exitoso")

Logging con Contexto
logger.WithFields(logger.Fields{
	"user_id":  "123",
	"order_id": "ORD-456",
	"amount":   99.99,
}).Info("Orden procesada")

userLogger := logger.WithUser(userID)
userLogger.Info("Usuario autenticado")

requestLogger := logger.WithRequest("/api/users", "192.168.1.1")
requestLogger.Info("Procesando request")

🎯 Niveles de Log

Nivel Uso Icono
Debug Detalles técnicos 🔍
Info Información general
Warn Advertencias
Error Errores recuperables
Fatal Errores críticos (termina app) 💀
Security Eventos de seguridad 🔒
Off Deshabilita logs 🚫

📝 Writers Disponibles

Console Writer
console := logger.NewConsoleWriter(true)

File Writer (JSON)
fileWriter, err := logger.NewFileWriter("app.log")

Database Writer (PostgreSQL)
dbWriter, err := logger.NewDBWriter(db, 1000)

Características:

  • Escritura batch
  • Goroutine dedicada
  • No bloquea la aplicación

🔌 Integración con Gin

Middleware Global
import (
	"github.com/AndresGT/gokit/logger"
	"github.com/gin-gonic/gin"
)

func main() {
	logger.InitGlobal(logger.Config{
		MinLevel: logger.DebugLevel,
	})

	r := gin.New()

	r.Use(logger.GinMiddleware())
	r.Use(logger.GinRecovery())

	r.Run(":8080")
}
Uso en Handlers
func GetUser(c *gin.Context) {
	logger.LogRequestInfo(c, "Obteniendo usuario")

	reqLogger := logger.GetLogger(c)
	reqLogger.Info("Query ejecutado")

	c.JSON(200, gin.H{"ok": true})
}

Registro de Rutas
api := r.Group("/api")

logger.RegisterRoute(api, "GET", "/users", getUsers, false)
logger.RegisterRoute(api, "POST", "/users", createUser, true)

logger.RegisterRoutes(api, []logger.Route{
	{Method: "GET", Path: "/products", Handler: getProducts},
	{Method: "POST", Path: "/products", Handler: createProduct, Protected: true},
})

Salida:

[ROUTE] → [GET]  /api/users
[ROUTE] 🔒 [POST] /api/users

⚙️ Configuración por Ambiente

func setupLogger(env string) *logger.Logger {
	var cfg logger.Config

	switch env {
	case "production":
		fileWriter, _ := logger.NewFileWriter("logs/app.log")
		cfg = logger.Config{
			MinLevel:     logger.WarnLevel,
			EnableColors: false,
			Writers: []logger.Writer{
				logger.NewConsoleWriter(false),
				fileWriter,
			},
		}

	default:
		cfg = logger.Config{
			MinLevel:     logger.DebugLevel,
			EnableColors: true,
			Writers: []logger.Writer{
				logger.NewConsoleWriter(true),
			},
		}
	}

	return logger.New(cfg)
}

🔄 Compatibilidad con Código Existente

API legacy soportada:

logger.LogInfo("mensaje")
logger.LogError("error: %v", err)
logger.DisableLogs()

Nueva API (recomendada):

logger.Info("mensaje")
logger.Error("error: %v", err)

🧪 Testing

func TestExample(t *testing.T) {
	testLogger := logger.New(logger.Config{
		MinLevel: logger.OffLevel,
	})

	logger.SetDefault(testLogger)

	logger.Info("no debería mostrarse")
}

📈 Performance

  • Console Writer: ~100,000 logs/segundo
  • File Writer: ~50,000 logs/segundo
  • DB Writer: ~10,000 logs/segundo (batch)

📄 Licencia

MIT



Parte de gokit — tu toolkit personal de Go para desarrollo rápido y escalable.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Debug

func Debug(f string, a ...interface{})

func DisableLogs

func DisableLogs()

func EnableLogs

func EnableLogs()

func Error

func Error(f string, a ...interface{})

func Fatal

func Fatal(f string, a ...interface{})

func GinMiddleware

func GinMiddleware() gin.HandlerFunc

GinMiddleware middleware global de logging (usa logger global)

func GinRecovery

func GinRecovery() gin.HandlerFunc

func Info

func Info(f string, a ...interface{})

func LogRequestError

func LogRequestError(c *gin.Context, format string, args ...interface{})

func LogRequestInfo

func LogRequestInfo(c *gin.Context, format string, args ...interface{})

func LogRequestSecurity

func LogRequestSecurity(c *gin.Context, format string, args ...interface{})

func LogRequestWarn

func LogRequestWarn(c *gin.Context, format string, args ...interface{})

func RegisterRoute

func RegisterRoute(group *gin.RouterGroup, method, path string, handler gin.HandlerFunc, protected bool)

RegisterRoute registra una ruta y la loguea

func RegisterRouteWithConfig

func RegisterRouteWithConfig(group *gin.RouterGroup, method, path string, handler gin.HandlerFunc, protected bool, cfg RouteConfig)

RegisterRouteWithConfig registra una ruta con config personalizada

func RegisterRoutes

func RegisterRoutes(group *gin.RouterGroup, routes []Route)

RegisterRoutes registra múltiples rutas

func Security

func Security(f string, a ...interface{})

func SetDefault

func SetDefault(l *Logger)

SetDefault reemplaza el logger global

func Success

func Success(f string, a ...interface{})

func Warn

func Warn(f string, a ...interface{})

Types

type AppLog

type AppLog struct {
	ID        uuid.UUID `gorm:"type:uuid;primaryKey"`
	Level     string
	Message   string
	Extra     []byte `gorm:"type:jsonb"`
	CreatedAt time.Time
}

type Config

type Config struct {
	MinLevel     Level
	EnableColors bool
	Writers      []Writer
	ServiceName  string
}

Config del logger

type ConsoleWriter

type ConsoleWriter struct {
	// contains filtered or unexported fields
}

func NewConsoleWriter

func NewConsoleWriter(enableColors bool) *ConsoleWriter

func (*ConsoleWriter) Close

func (w *ConsoleWriter) Close() error

func (*ConsoleWriter) Write

func (w *ConsoleWriter) Write(entry *Entry) error

type DBWriter

type DBWriter struct {
	// contains filtered or unexported fields
}

func NewDBWriter

func NewDBWriter(db *gorm.DB, buffer int) (*DBWriter, error)

func (*DBWriter) Close

func (w *DBWriter) Close() error

func (*DBWriter) Write

func (w *DBWriter) Write(entry *Entry) error

type Entry

type Entry struct {
	ID        uuid.UUID `json:"id"`
	Level     Level     `json:"level"`
	Message   string    `json:"message"`
	Timestamp time.Time `json:"timestamp"`
	Service   string    `json:"service,omitempty"`
	TraceID   string    `json:"trace_id,omitempty"`
	Fields    Fields    `json:"fields,omitempty"`
}

type Fields

type Fields map[string]interface{}

type FileWriter

type FileWriter struct {
	// contains filtered or unexported fields
}

func NewFileWriter

func NewFileWriter(path string) (*FileWriter, error)

func (*FileWriter) Close

func (w *FileWriter) Close() error

func (*FileWriter) Write

func (w *FileWriter) Write(entry *Entry) error

type Level

type Level int
const (
	DebugLevel Level = iota
	InfoLevel
	WarnLevel
	ErrorLevel
	FatalLevel
	SecurityLevel
	OffLevel // nivel para deshabilitar logs
)

func (Level) String

func (l Level) String() string

type Logger

type Logger struct {
	// contains filtered or unexported fields
}

func Default

func Default() *Logger

Default devuelve el logger global

func GetLogger

func GetLogger(c *gin.Context) *Logger

GetLogger obtiene el logger del contexto Gin

func InitGlobal

func InitGlobal(cfg Config) *Logger

func New

func New(cfg Config) *Logger

New crea un logger

func WithContext

func WithContext(ctx context.Context) *Logger

func WithFields

func WithFields(f Fields) *Logger

func WithRequest

func WithRequest(e, ip string) *Logger

func WithUser

func WithUser(id uuid.UUID) *Logger

func (*Logger) AddWriter

func (l *Logger) AddWriter(w Writer)

func (*Logger) Clone

func (l *Logger) Clone() *Logger

func (*Logger) Close

func (l *Logger) Close() error

func (*Logger) Debug

func (l *Logger) Debug(f string, a ...interface{})

func (*Logger) Error

func (l *Logger) Error(f string, a ...interface{})

func (*Logger) Fatal

func (l *Logger) Fatal(f string, a ...interface{})

func (*Logger) Info

func (l *Logger) Info(f string, a ...interface{})

func (*Logger) Security

func (l *Logger) Security(f string, a ...interface{})

func (*Logger) SetMinLevel

func (l *Logger) SetMinLevel(level Level)

func (*Logger) Success

func (l *Logger) Success(f string, a ...interface{})

func (*Logger) Warn

func (l *Logger) Warn(f string, a ...interface{})

func (*Logger) WithContext

func (l *Logger) WithContext(ctx context.Context) *Logger

func (*Logger) WithFields

func (l *Logger) WithFields(fields Fields) *Logger

func (*Logger) WithRequest

func (l *Logger) WithRequest(endpoint, ip string) *Logger

func (*Logger) WithUser

func (l *Logger) WithUser(userID uuid.UUID) *Logger

type Route

type Route struct {
	Method    string
	Path      string
	Handler   gin.HandlerFunc
	Protected bool
}

Route representa una ruta a registrar

type RouteConfig

type RouteConfig struct {
	ShowProtected bool
	ShowTimestamp bool
}

type Writer

type Writer interface {
	Write(entry *Entry) error
	Close() error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL