Introducción: Por qué el logging es críticamente importante en Rust
El logging no es solo registrar eventos en un archivo. En sistemas de alta carga y seguros, donde Rust encuentra su aplicación principal (servidores web, utilidades CLI, sistemas embebidos), los logs son la única fuente de verdad durante la depuración y el monitoreo. Rust ofrece un ecosistema donde elegir el enfoque correcto para el logging puede afectar significativamente el rendimiento y la facilidad de mantenimiento del código.
En este artículo, analizaremos los principios básicos del logging en Rust, comenzando con el crate base log y terminando con herramientas avanzadas como tracing. Aprenderá cómo evitar errores típicos, configurar niveles de logging y estructurar la salida para su análisis.
Fundamentos: El crate log y la arquitectura de fachada
En Rust, el estándar de facto es el crate log. Proporciona una fachada (abstracción) que no depende de un backend específico. Usted escribe código usando las macros log::info!, log::error!, y la elección de la implementación (dónde escribir: en archivo, consola, syslog) queda en manos del usuario de la biblioteca.
Instalación y configuración básica
Agregue a Cargo.toml:
[dependencies]log = "0.4"env_logger = "0.11"env_logger es el backend más popular para la salida a stderr. Se configura a través de la variable de entorno RUST_LOG.
Ejemplo de logging simple
use log::{info, warn, error};
fn main() { env_logger::init();
info!("Aplicación iniciada"); warn!("Esto es una advertencia"); error!("Error crítico: {}", 42);}Ejecute con el nivel: RUST_LOG=info cargo run. Verá solo info y superiores. Si no se establece la variable, los logs no se mostrarán.
Niveles de logging
En log se definen 5 niveles (en orden ascendente de prioridad):
trace— información de depuración extremadamente detallada (por ejemplo, entrada/salida de funciones).debug— útil para el desarrollador durante la depuración.info— eventos importantes del funcionamiento de la aplicación (inicio, parada, operaciones exitosas).warn— situaciones potencialmente peligrosas que no interrumpen el funcionamiento.error— errores irreparables que requieren intervención.
Consejo: En producción, use el nivel info o warn. Es mejor dejar trace y debug para el desarrollo.
Mejores prácticas: Cómo escribir logs correctamente
Simplemente insertar info!("Something") no es suficiente. Para que los logs sean útiles, siga estas reglas.
1. Logs estructurados en lugar de cadenas
Evite la concatenación manual de cadenas. Use campos con nombre. En log esto se hace mediante formato:
let user_id = 123;let action = "login";info!("Usuario {} realizó {}", user_id, action);Para estructuración avanzada (JSON), use el crate slog o tracing.
2. Contexto e identificadores
Siempre agregue contexto: request_id, user_id, session_id. Esto permite vincular logs en sistemas distribuidos.
warn!("Error de validación", user_id = user_id, field = "email", reason = "formato incorrecto");3. Evite el logging en bucles críticos
El logging es una operación costosa (entrada/salida). No coloque trace! dentro de bucles con millones de iteraciones. Use logging condicional o contadores de métricas.
4. Use RUST_LOG para configuración flexible
Puede filtrar logs por módulos y crates:
RUST_LOG="warn,my_crate=debug,othe