En el ecosistema de Go, el logging es una parte fundamental del desarrollo. Logrus es una biblioteca popular que proporciona soluciones de registro robustas y configurables para aplicacionse en Go. Esta guía explora sus capacidades esenciales, como la configuración de formatos, niveles de logging y el uso de hooks personalizados.
Instalación de Logrus
Para integrar Logrus en un proyecto, se utiliza el siguiente comando:
go get github.com/sirupsen/logrus
Configuración Básica
Logrus permite definir el destino de salida, el formato y el nivel de detalle de los logs. A continuación, un ejemplo de configuración que envía logs tanto a un archivo como a la consola, con formato JSON y nivel de detalle máximo:
package main
import (
"github.com/sirupsen/logrus"
"io"
"os"
)
func main() {
logFile, err := os.OpenFile("application.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
logrus.Fatal("No se pudo abrir el archivo de logs: ", err)
}
multiOutput := io.MultiWriter(logFile, os.Stdout)
logrus.SetOutput(multiOutput)
logrus.SetReportCaller(true)
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(logrus.TraceLevel)
logrus.Error("Mensaje de nivel Error")
logrus.Warn("Mensaje de nivel Warn")
logrus.Info("Mensaje de nivel Info")
logrus.Debug("Mensaje de nivel Debug")
}
Formatos de Logging Personalizados
Logrus soporta varios formatos, incluyendo JSON y texto con marcas de tiempo. Para un formato de texto legible con color y marcas de tiempo detalladas, se puede usar:
logrus.SetFormatter(&logrus.TextFormatter{
ForceColors: true,
FullTimestamp: true,
TimestampFormat: "02-01-2006 15:04:05",
})
Añadir Información Contextual
Es posible enriquecer los logs con datos contextuales mediante campos clave-valor. Esto facilita el análisis posterior de los registros:
logger := logrus.WithFields(logrus.Fields{
"servicio": "api-gateway",
"version": "2.0",
})
logger.Info("Solicitud procesada correctamente")
Implementación de Hooks
Los hooks permiten extender la funcionalidad de Logrus ejecutando lógica personalizada cuando se emiten eventos de log. Por ejemplo, un hook para registrar metadatos adicionales:
type MetadataHook struct{}
func (h *MetadataHook) Levels() []logrus.Level {
return logrus.AllLevels
}
func (h *MetadataHook) Fire(entry *logrus.Entry) error {
entry.Data["entorno"] = "produccion"
entry.Data["timestamp_personalizado"] = time.Now().Format(time.RFC3339)
return nil
}
func main() {
logrus.AddHook(&MetadataHook{})
logrus.WithField("accion", "inicio").Info("Hook aplicado exitosamente")
}
Logrus ofrece una solución de logging versátil para aplicaciones en Go, con soporte para múltiples formatos, niveles detallados y extensibilidad mediante hooks. Su configuración sencilla y características avanzadas lo convierten en una herramienta valiosa para el desarrollo de software en Go.