Tracing para Rust: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Tracing y por qué es necesario en Rust?

\n\n

La 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\n

El 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\n

La biblioteca es parte del ecosistema Tokio y se utiliza activamente en proyectos como actix-web, axum, hyper y muchos otros.

\n\n

Instalación de Tracing

\n\n

Para agregar Tracing a tu proyecto en Rust, abre el archivo Cargo.toml y agrega las siguientes dependencias:

\n\n
[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"  # Para mostrar registros en consola\ntracing-appender = "0.2"    # Para escribir registros en archivo (opcional)
\n\n

Después de esto, ejecuta el comando cargo build para descargar y compilar las bibliotecas.

\n\n

Inicio rápido: primer ejemplo

\n\n

Escribamos un programa simple que registre un mensaje usando Tracing:

\n\n
use 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\n

Al ejecutarlo, verás una salida estructurada con marcas de tiempo, niveles y nombres de spans.

\n\n

Métodos y funciones principales de Tracing

\n\n

A continuación se presentan 10 funciones y macros clave de la biblioteca Tracing con descripción detallada y ejemplos.

\n\n

1. tracing::span! — Creación de un span

\n

Qué 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.

\n

Pará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
\n

Ejemplo:

\n
use 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\n

2. tracing::info! — Registro a nivel INFO

\n

Qué hace: Registra un evento con nivel INFO. Un evento es un mensaje único que puede estar asociado al span actual.

\n

Parámetros:

\n
    \n
  • Cadena de formato (como en format!)
  • \n
  • Argumentos para el formato
  • \n
  • Campos mediante field = value

Recommendations