Tracing pour Rust : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que Tracing et pourquoi en a-t-on besoin dans Rust ?

\n\n

La bibliothèque Tracing est un framework puissant pour la journalisation structurée et l'instrumentation (traçage) des applications en langage Rust. Contrairement aux simples enregistreurs, Tracing introduit le concept de spans et d'événements, qui permettent de suivre l'exécution du code dans le contexte d'opérations asynchrones, de systèmes distribués et d'appels imbriqués complexes.

\n\n

L'objectif principal de Tracing est de donner au développeur une image complète de ce qui se passe à l'intérieur du programme : quelles fonctions sont appelées, combien de temps elles s'exécutent, quelles erreurs surviennent et comment elles sont liées entre elles. C'est un outil indispensable pour le débogage, le profilage et la surveillance des systèmes en production.

\n\n

La bibliothèque fait partie de l'écosystème Tokio et est activement utilisée dans des projets tels que actix-web, axum, hyper et bien d'autres.

\n\n

Installation de Tracing

\n\n

Pour ajouter Tracing à votre projet Rust, ouvrez le fichier Cargo.toml et ajoutez les dépendances suivantes :

\n\n
[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"  # Pour afficher les logs dans la console\ntracing-appender = "0.2"    # Pour écrire les logs dans un fichier (optionnel)
\n\n

Ensuite, exécutez la commande cargo build pour télécharger et compiler les bibliothèques.

\n\n

Démarrage rapide : premier exemple

\n\n

Écrivons un programme très simple qui enregistre un message en utilisant Tracing :

\n\n
use tracing::{info, Level};\nuse tracing_subscriber::FmtSubscriber;\n\nfn main() {\n    // Initialisons un abonné (subscriber) pour afficher les logs dans stdout\n    let subscriber = FmtSubscriber::builder()\n        .with_max_level(Level::INFO)\n        .finish();\n    tracing::subscriber::set_global_default(subscriber)\n        .expect("Impossible de définir l'abonné global");\n\n    // Enregistrons un message simple\n    info!("Application démarrée !");\n\n    // Appel d'une fonction avec traçage\n    process_data("example.txt");\n}\n\nfn process_data(filename: &str) {\n    // Créons un span pour suivre la fonction\n    let span = tracing::span!(Level::INFO, "process_data", filename = filename);\n    let _guard = span.enter(); // Entrons dans le span\n\n    info!("Début du traitement du fichier");\n    // ... un certain travail ...\n    std::thread::sleep(std::time::Duration::from_millis(100));\n    info!("Traitement terminé");\n}
\n\n

Lors de l'exécution, vous verrez une sortie structurée avec des horodatages, des niveaux et des noms de spans.

\n\n

Méthodes et fonctions principales de Tracing

\n\n

Voici 10 fonctions et macros clés de la bibliothèque Tracing avec une description détaillée et des exemples.

\n\n

1. tracing::span! — Création d'un span

\n

Ce qu'il fait : Crée un nouveau span — une unité de travail logique qui peut être imbriquée. Le span a un nom, un niveau et un ensemble de champs.

\n

Paramètres :

\n
    \n
  • Level — le niveau de journalisation (ERROR, WARN, INFO, DEBUG, TRACE)
  • \n
  • target (optionnel) — une chaîne identifiant le module
  • \n
  • field = value — des champs arbitraires pour le contexte
  • \n
\n

Exemple :

\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    // Code à l'intérieur du span\n    tracing::info!("Traitement de la requête");\n}
\n\n

2. tracing::info! — Journalisation au niveau INFO

\n

Ce qu'il fait : Enregistre un événement avec le niveau INFO. Un événement est un message unique qui peut être lié au span actuel.

\n

Paramètres :

\n
    \n
  • Chaîne de formatage (comme dans format!)
  • \n
  • Arguments pour le formatage
  • \n
  • Champs via field = value<

Recommendations