¿Qué es Tracing y por qué es necesario en Rust?
\n\nLa biblioteca Tracing es un potente framework para el registro estructurado y la instrumentación (trazado) de aplicaciones en el lenguaje Rust. A diferencia de los registradores simples, Tracing proporciona el concepto de spans y eventos (events), que permiten rastrear la ejecución del código en el contexto de operaciones asíncronas, sistemas distribuidos y llamadas anidadas complejas.
\n\nEl objetivo principal de Tracing es brindar al desarrollador una imagen completa de lo que sucede dentro del programa: qué funciones se llaman, cuánto tiempo se ejecutan, qué errores ocurren y cómo se relacionan entre sí. Es una herramienta indispensable para la depuración, la creación de perfiles y la monitorización de sistemas en producción.
\n\nLa biblioteca es parte del ecosistema Tokio y se utiliza activamente en proyectos como actix-web, axum, hyper y muchos otros.
Instalación de Tracing
\n\nPara agregar Tracing a tu proyecto en Rust, abre el archivo Cargo.toml y agrega las siguientes dependencias:
[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3" # Para mostrar registros en consola\ntracing-appender = "0.2" # Para escribir registros en archivo (opcional)\n\nDespués de esto, ejecuta el comando cargo build para descargar y compilar las bibliotecas.
Inicio rápido: primer ejemplo
\n\nEscribamos un programa simple que registre un mensaje usando Tracing:
\n\nuse tracing::{info, Level};\nuse tracing_subscriber::FmtSubscriber;\n\nfn main() {\n // Inicializamos el suscriptor (subscriber) para mostrar registros en stdout\n let subscriber = FmtSubscriber::builder()\n .with_max_level(Level::INFO)\n .finish();\n tracing::subscriber::set_global_default(subscriber)\n .expect("No se pudo establecer el suscriptor global");\n\n // Registramos un mensaje simple\n info!("¡Aplicación iniciada!");\n\n // Llamada a una función con trazado\n process_data("example.txt");\n}\n\nfn process_data(filename: &str) {\n // Creamos un span para rastrear la función\n let span = tracing::span!(Level::INFO, "process_data", filename = filename);\n let _guard = span.enter(); // Entramos al span\n\n info!("Iniciando procesamiento del archivo");\n // ... algún trabajo ...\n std::thread::sleep(std::time::Duration::from_millis(100));\n info!("Procesamiento completado");\n}\n\nAl ejecutarlo, verás una salida estructurada con marcas de tiempo, niveles y nombres de spans.
\n\nMétodos y funciones principales de Tracing
\n\nA continuación se presentan 10 funciones y macros clave de la biblioteca Tracing con descripción detallada y ejemplos.
\n\n1. tracing::span! — Creación de un span
\nQué hace: Crea un nuevo span — una unidad lógica de trabajo que puede estar anidada. El span tiene un nombre, un nivel y un conjunto de campos.
\nParámetros:
\n- \n
Level— nivel de registro (ERROR, WARN, INFO, DEBUG, TRACE) \n target(opcional) — cadena que identifica el módulo \n field = value— campos arbitrarios para el contexto \n
Ejemplo:
\nuse tracing::Level;\n\nfn handle_request(id: u64) {\n let span = tracing::span!(Level::INFO, "handle_request", request_id = id);\n let _guard = span.enter();\n // Código dentro del span\n tracing::info!("Procesando solicitud");\n}\n\n2. tracing::info! — Registro a nivel INFO
\nQué hace: Registra un evento con nivel INFO. Un evento es un mensaje único que puede estar asociado al span actual.
\nParámetros:
\n- \n
- Cadena de formato (como en
format!) \n - Argumentos para el formato \n
- Campos mediante
field = value
También en la biblioteca
calamine en Rust: guía completa con ejemplos prácticos
Cliente HTTP para Kotlin: Las mejores bibliotecas para trabajar con la red
gRPC para C# (.NET): bibliotecas, configuración y ejemplos de código
Guía completa de Drogon para C++ con ejemplos