Registro en aplicaciones Go: mejores prácticas para principiantes
\n\nEl registro es uno de los componentes clave de cualquier aplicación seria. Ayuda a rastrear errores, analizar el comportamiento del sistema y comprender qué sucede "bajo el capó". En este artículo, analizaremos las mejores prácticas de registro en Go (Golang) para desarrolladores principiantes. Aprenderá qué bibliotecas usar, cómo organizar los logs y evitar errores típicos.
\n\n¿Por qué es importante el registro en Go?
\n\nGo es un lenguaje orientado a la creación de aplicaciones de servidor de alta carga y microservicios. En tales sistemas, sin un registro de calidad es imposible:
\n\n- \n
- Encontrar rápidamente la causa de una falla \n
- Comprender la secuencia de eventos \n
- Recopilar métricas para monitoreo \n
- Depurar código en un entorno de producción \n
Un registro mal configurado puede provocar la pérdida de datos críticos o, por el contrario, el llenado del disco con millones de mensajes inútiles. Por lo tanto, es importante establecer la arquitectura correcta desde el principio.
\n\nLa biblioteca estándar log
\n\nGo proporciona el paquete integrado log, que es adecuado para proyectos simples. Puede enviar mensajes a stdout/stderr, agregar marcas de tiempo y finalizar el programa en caso de errores fatales.
package main\n\nimport (\n "log"\n)\n\nfunc main() {\n log.Println("Aplicación iniciada")\n log.Printf("Usuario %s ha iniciado sesión", "admin")\n // log.Fatal("Error crítico") // finaliza el programa\n}\n\nDesventajas del registrador estándar:
\n- \n
- No tiene niveles de registro (debug, info, warn, error) \n
- No tiene salida estructurada (solo texto) \n
- Es difícil cambiar el formato y la dirección de salida \n
Para proyectos educativos y utilidades simples, esto es suficiente, pero para aplicaciones de producción es mejor usar bibliotecas más potentes.
\n\nBibliotecas populares para registro
\n\nConsideremos las tres opciones más comunes.
\n\n1. Logrus
\n\nLogrus es una de las primeras bibliotecas de terceros para Go. Admite niveles de registro, campos estructurados y múltiples formatos de salida (JSON, texto).
\n\npackage main\n\nimport (\n "github.com/sirupsen/logrus"\n)\n\nfunc main() {\n log := logrus.New()\n log.SetFormatter(&logrus.JSONFormatter{})\n log.SetLevel(logrus.InfoLevel)\n\n log.WithFields(logrus.Fields{\n "user": "ivan",\n "action": "login",\n }).Info("Usuario ha iniciado sesión")\n}\n\nLogrus es fácil de usar, pero tiene un alto consumo de memoria y es un poco más lento que las alternativas modernas.
\n\n2. Zerolog
\n\nZerolog es una biblioteca moderna centrada en el rendimiento y la asignación mínima de memoria. Utiliza un enfoque de zero-allocation y es ideal para sistemas de alta carga.
\n\npackage main\n\nimport (\n "github.com/rs/zerolog"\n "github.com/rs/zerolog/log"\n)\n\nfunc main() {\n zerolog.TimeFieldFormat = zerolog.TimeFormatUnix\n\n log.Info().\n Str("user", "ivan").\n Str("action", "login").\n Msg("Usuario ha iniciado sesión")\n\n log.Error().\n Err(fmt.Errorf("connection refused")).\n Msg("Error de conexión a la BD")\n}\n\nZerolog genera logs en formato JSON por defecto, lo que facilita su análisis por sistemas de monitoreo (ELK, Grafana Loki).
\n\n3. Zap
\n\nZap de Uber es otro registrador de alto rendimiento. Funciona en dos modos: SugaredLogger (conveniente, pero un poco más lento) y Logger (máxima velocidad).
package main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n logger, _ := zap.NewProduction()\n defer logger.Sync()\n\n logger.Info("Servidor iniciado",\n zap.String("port", "8080"),\n zap.Int("workers", 10),\n )\n}\n\nPara n