Introducción
¡Hola a todos! Hoy vamos a explorar una nueva forma de registro: Slog. El registro proporciona información sobre el comportamiento del software y ayuda en la identificación y solución de problemas. El paquete de registro estándar de Go ofrece funcionalidades básicas de registro, como el registro de mensajes con marcas de tiempo. Sin embargo, a medida que las aplicaciones crecen en complejidad, las limitaciones del paquete de registro predeterminado se hacen evidentes, lo que lleva a los desarrolladores a buscar un registro más sofisticado.
Una de las principales limitaciones del paquete de registro predeterminado es su falta de organización. Slog aborda esto ofreciendo soporte de primera clase para el registro estructurado, lo que facilita la producción de registros legibles para humanos y máquinas. Slog ofrece niveles de registro fuera de la caja, mayor flexibilidad y extensibilidad, permitiendo a los desarrolladores personalizar el comportamiento de registro para adaptarse a las necesidades de su aplicación. Esto incluye soporte para niveles de registro personalizados, múltiples destinos de salida y registro específico del contexto.
Slog está diseñado teniendo en cuenta el rendimiento, proporcionando una solución de registro más rápida y eficiente que el paquete de registro predeterminado. Esto es particularmente beneficioso en aplicaciones de alto rendimiento donde el registro puede tener un impacto significativo en el rendimiento.
Cómo Funciona Slog
Comencemos con un registro simple utilizando el nivel de registro “info”. Aquí se imprimen la marca de tiempo, el nivel de registro y el mensaje.
package main
import (
"github.com/slog"
)
func main() {
slog.Info("Hello, World!")
}
En la terminal, se imprime:
2024-03-30T10:00:00Z INFO Hello, World!
Ahora veamos cómo funcionan diferentes niveles de registro. Probaremos los niveles de error y advertencia.
package main
import "github.com/slog"
func main() {
slog.Error("An error occurred")
slog.Warning("This is a warning")
}
En la terminal, se imprime:
2024-03-30T10:00:00Z ERROR An error occurred
2024-03-30T10:00:00Z WARNING This is a warning
Personalización del Registro
Slog permite la impresión de variables desde el código. El primer argumento es el mensaje y después de eso pasamos pares clave-valor. Por ejemplo, si queremos imprimir la versión de Go, la clave sería “versión” y obtendríamos el valor del tiempo de ejecución utilizando el método runtime.Version
.
Aún así, los registros no se ven organizados y legibles para las máquinas. Slog proporciona dos manejadores: “text” y “JSON”, que formatean bien los registros.
Manejadores de Slog
Para usar el manejador “text”, creamos un nuevo registrador con el método New
de Slog. El primer argumento es un manejador de Slog, y crearemos un nuevo manejador de texto. Requerirá un escritor de entrada/salida, usaremos os.Stderr
por ahora. Ahora tenemos un nuevo registrador. Reemplacemos slog
con logger
.
package main
import (
"os"
"github.com/slog"
)
func main() {
logger := slog.New(slog.NewTextHandler(os.Stderr))
logger.Info("Hello, World!")
}
1621872998015 INFO Hello, World!
El tiempo se imprime en milisegundos y se muestran diferentes niveles de registro. El mensaje tiene una clave “mensaje” y se imprimen otros valores clave aquí.
Niveles de Registro Personalizados
Por defecto, el nivel de depuración está apagado. Necesitamos cambiar el nivel de registro.
package main
import (
"os"
"github.com/slog"
)
func main() {
logger := slog.New(slog.NewTextHandler(os.Stderr))
logger.SetLevel(slog.DebugLevel)
logger.Debug("This is a debug message")
}
Ahora la impresión de depuración aparece en la consola.
1621872998015 DEBUG This is a debug message
Manejador JSON
Reemplace la función New
del manejador de texto con New
del manejador JSON.
package main
import (
"os"
"github.com/slog"
)
func main() {
logger := slog.New(slog.NewJSONHandler(os.Stderr))
logger.Info("Hello, World!")
}
La salida está formateada como JSON.
{"time":"2024-03-30T10:00:00Z","level":"INFO","message":"Hello, World!"}
Organización Adicional del Registro
Podemos crear un grupo de registros, similar a JSON anidado.
package main
import (
"os"
"runtime"
"github.com/slog"
)
func main() {
logger := slog.New(slog.NewTextHandler(os.Stderr))
logger.Group("OS Info", func(group slog.Group) {
group.String("OS", runtime.GOOS)
group.Int("CPUs", runtime.NumCPU())
group.String("Arch", runtime.GOARCH)
})
logger.Info("Hello, World!")
}
La información del sistema operativo aparece como JSON anidado.
2024-03-30T10:00:00Z INFO Hello, World!
{
"OS Info": {
"OS": "linux",
"CPUs": 4,
"Arch": "amd64"
}
}
Atributos del Registro
Podemos agregar atributos al registrador con el método WithAttributes
en el manejador. Esto requiere una lista de atributos de Slog. Por ejemplo, agregaremos una cadena Slog con la clave “versión de la aplicación” y pondremos una versión aleatoria como valor. Ahora la versión de la aplicación se agrega a la impresión.
package main
import (
"os"
"github.com/slog"
)
func main() {
logger := slog.New(slog.NewTextHandler(os.Stderr).WithAttributes(
slog.String("App Version", "1.0.0"),
))
logger.Info("Hello, World!")
}
En la terminal, se imprime:
2024-03-30T10:00:00Z INFO Hello, World! {"App Version":"1.0.0"}
Conclusión
En conclusión, exploramos Slog, una biblioteca que ofrece una nueva forma de registro estructurado en aplicaciones Go. A diferencia del paquete de registro estándar, Slog proporciona una organización mejorada, niveles de registro personalizados, múltiples manejadores de salida y una sintaxis más flexible para registrar mensajes. Además, Slog está diseñado para ser eficiente en cuanto a rendimiento, lo que lo hace ideal para aplicaciones de alto rendimiento donde el registro puede tener un impacto significativo en el rendimiento general del sistema.
Al adoptar Slog en nuestras aplicaciones, podemos mejorar la claridad de los registros, facilitar la resolución de problemas y obtener una comprensión más profunda del comportamiento del software. El registro estructurado con Slog no solo es una tarea funcional, sino un arte que nos permite comunicarnos de manera más efectiva con nuestras aplicaciones y obtener información valiosa para mejorar su calidad y rendimiento.
En resumen, Slog no solo es una herramienta de registro, sino una herramienta poderosa que nos ayuda a comprender mejor nuestras creaciones digitales y a tomar decisiones informadas para mejorarlas continuamente.