Introducción al logging en Go: Zap y Logrus
\n\nEl logging es un componente crítico de cualquier aplicación seria. Permite rastrear el estado del programa, registrar errores, analizar el rendimiento y depurar código en entornos de producción. En la biblioteca estándar de Go existe el paquete log, pero tiene capacidades limitadas: no tiene niveles de logging (excepto los primitivos), no tiene salida estructurada, ni formatos flexibles. Para resolver estos problemas se crearon dos potentes bibliotecas: Zap (de Uber) y Logrus (uno de los primeros loggers populares).
En este artículo analizaremos en detalle ambas bibliotecas, sus métodos, ejemplos de uso y mejores prácticas. Aprenderá cómo configurar el logging estructurado, cómo trabajar con niveles, cómo agregar campos contextuales y cómo evitar errores típicos.
\n\n¿Qué es Zap?
\nZap es una biblioteca de alto rendimiento para logging estructurado de la empresa Uber. Está orientada a la velocidad y la mínima asignación de memoria. Zap admite dos modos de trabajo: SugaredLogger (cómodo, pero un poco más lento) y Logger (máximo rendimiento).
\n\n¿Qué es Logrus?
\nLogrus es una de las primeras y más populares bibliotecas de logging en Go. Proporciona una API simple, soporte para niveles, formateadores (JSON, Text) y hooks para integración con sistemas externos (por ejemplo, Sentry, Slack). Logrus es más fácil de aprender, pero es inferior a Zap en rendimiento.
\n\nInstalación
\nLa instalación de ambas bibliotecas se realiza de forma estándar mediante go get:
// Instalación de Zap\ngo get -u go.uber.org/zap\n\n// Instalación de Logrus\ngo get -u github.com/sirupsen/logrus\n\n\nDespués de la instalación, puede importarlas en su proyecto:
\n\nimport (\n "go.uber.org/zap"\n "github.com/sirupsen/logrus"\n)\n\n\nInicio rápido con ejemplo de código
\n\nEjemplo con Zap
\npackage main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n // Creamos un logger de producción (alto rendimiento)\n logger, _ := zap.NewProduction()\n defer logger.Sync() // vaciamos el búfer antes de salir\n\n // Registramos un mensaje con campos\n logger.Info("Aplicación iniciada",\n zap.String("version", "1.0.0"),\n zap.Int("port", 8080),\n )\n\n // Usamos SugaredLogger por comodidad\n sugar := logger.Sugar()\n sugar.Infow("Usuario inició sesión",\n "user", "john_doe",\n "ip", "192.168.1.1",\n )\n}\n\n\nEjemplo con Logrus
\npackage main\n\nimport (\n "github.com/sirupsen/logrus"\n)\n\nfunc main() {\n // Configuramos el formato de salida (JSON)\n logrus.SetFormatter(&logrus.JSONFormatter{})\n\n // Establecemos el nivel de logging\n logrus.SetLevel(logrus.InfoLevel)\n\n // Registramos un mensaje con campos\n logrus.WithFields(logrus.Fields{\n "version": "1.0.0",\n "port": 8080,\n }).Info("Aplicación iniciada")\n\n // Registramos un error\n logrus.WithFields(logrus.Fields{\n "user": "john_doe",\n "ip": "192.168.1.1",\n }).Warn("Intento de inicio de sesión con contraseña incorrecta")\n}\n\n\nMétodos y funciones principales
\n\n1. Zap: NewProduction() / NewDevelopment()
\nQué hace: Crea un logger preconfigurado para entornos de producción o desarrollo. El logger de producción usa formato JSON y está optimizado para velocidad. El logger de desarrollo usa salida de texto con colores e incluye stack traces.
\nParámetros: Ninguno (devuelve *zap.Logger y un error).
Ejemplo:
\nprodLogger, _ := zap.NewProduction()\ndevLogger, _ := zap.NewDevelopment()\n\n\n2. Zap: Logger.Info(),
También en la biblioteca
GraphQL en Node.js: Guía completa sobre la biblioteca graphql-http
Criptografía en Go: cifrado y hash para principiantes
Programación reactiva en C# (.NET) — Observable, Rx.NET y LINQ
MkDocs – generación de documentación para proyectos
Envío de SMS en C# (.NET): Integración con API de servicios SMS a través de HttpClient
Recommendations
También en la biblioteca
GraphQL en Node.js: Guía completa sobre la biblioteca graphql-http
Programación reactiva en C# (.NET) — Observable, Rx.NET y LINQ
Envío de SMS en C# (.NET): Integración con API de servicios SMS a través de HttpClient