Registro para Go (Golang): mejores soluciones
El registro es una de las tareas clave al desarrollar cualquier aplicación seria en Go. Un registro correctamente configurado permite encontrar errores rápidamente, analizar el rendimiento y monitorear el comportamiento del sistema en producción. En este artículo, analizaremos las bibliotecas de registro más populares y modernas en Go, sus fortalezas y debilidades, y proporcionaremos ejemplos prácticos de código.
¿Por qué es necesario el registro en Go?
A diferencia de la simple salida a consola, el registro industrial requiere:
- Estructuración — salida en formato JSON para una fácil integración con sistemas de recolección de registros (ELK, Grafana Loki, Datadog);
- Niveles de registro — debug, info, warn, error, fatal;
- Rendimiento — impacto mínimo en la velocidad de la aplicación;
- Contexto — adición de metadatos (ID de solicitud, nombre de usuario, nombre de función).
La biblioteca estándar log no admite salida estructurada ni niveles, por lo que los desarrolladores de Go utilizan activamente soluciones de terceros.
1. log/slog — paquete estándar de Go 1.21
A partir de la versión Go 1.21, se agregó el paquete log/slog a la biblioteca estándar. Proporciona registro estructurado "listo para usar" y no requiere la instalación de dependencias adicionales.
Ventajas:
- Soporte oficial de los desarrolladores de Go;
- Configuración flexible a través de
Handler(JSON, texto, personalizado); - Niveles integrados (
Debug,Info,Warn,Error); - Soporte para contexto y grupos de atributos.
Ejemplo de uso:
package main
import ( "log/slog" "os")
func main() { // Logger JSON logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info("Servidor iniciado", "port", 8080, "env", "production")
// Logger de texto con nivel Debug textLogger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelDebug, })) textLogger.Debug("Depuración de conexión", "ip", "192.168.1.1")}Si está iniciando un nuevo proyecto en Go 1.21+, slog es la mejor opción para la mayoría de las tareas.
2. zerolog — rendimiento máximo
La biblioteca zerolog (github.com/rs/zerolog) es conocida por su excepcional velocidad. Utiliza zero-asignaciones para formatear JSON, lo que la convierte en una de las más rápidas del ecosistema Go.
Características:
- Asignación mínima de memoria (zero allocation);
- Niveles de registro: trace, debug, info, warn, error, fatal, panic;
- Encadenamiento de métodos para agregar campos;
- Soporte para salida a consola con colores.
Ejemplo:
package main
import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log")
func main() { zerolog.TimeFieldFormat = zerolog.TimeFormatUnix log.Info().Str("service", "api").Int("status", 200).Msg("Solicitud procesada")
// Nivel Error con stack trace log.Error().Err(err).Str("method", "GET").Msg("Error en la solicitud")}Cuándo elegir zerolog: cuando el rendimiento es crítico (microservicios de alta carga, API con millones de solicitudes).
3. zap — potente y rápido de Uber
La biblioteca zap (go.uber.org/zap) es otro líder en rendimiento. Fue desarrollada en Uber para necesidades internas, pero se ha convertido en un estándar de facto para muchos proyectos Go.
Características clave:
- Dos modos:
Logger(más lento, más conveniente)