Tracing für Rust: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist Tracing und warum wird es in Rust benötigt?

\n\n

Die Bibliothek Tracing ist ein leistungsstarkes Framework für strukturiertes Logging und Instrumentierung (Tracing) von Anwendungen in der Sprache Rust. Im Gegensatz zu einfachen Loggern bietet Tracing das Konzept von Spans und Events, die es ermöglichen, die Codeausführung im Kontext asynchroner Operationen, verteilter Systeme und komplexer verschachtelter Aufrufe zu verfolgen.

\n\n

Das Hauptziel von Tracing ist es, dem Entwickler ein vollständiges Bild davon zu geben, was innerhalb des Programms passiert: welche Funktionen aufgerufen werden, wie lange sie ausgeführt werden, welche Fehler auftreten und wie sie miteinander zusammenhängen. Dies ist ein unverzichtbares Werkzeug zum Debuggen, Profiling und Überwachen von Produktionssystemen.

\n\n

Die Bibliothek ist Teil des Tokio-Ökosystems und wird aktiv in Projekten wie actix-web, axum, hyper und vielen anderen verwendet.

\n\n

Installation von Tracing

\n\n

Um Tracing zu Ihrem Rust-Projekt hinzuzufügen, öffnen Sie die Datei Cargo.toml und fügen Sie die folgenden Abhängigkeiten hinzu:

\n\n
[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"  # Für die Ausgabe von Logs in die Konsole\ntracing-appender = "0.2"    # Für das Schreiben von Logs in eine Datei (optional)
\n\n

Führen Sie anschließend den Befehl cargo build aus, um die Bibliotheken herunterzuladen und zu kompilieren.

\n\n

Schnellstart: Erstes Beispiel

\n\n

Schreiben wir ein einfaches Programm, das eine Nachricht mit Tracing protokolliert:

\n\n
use tracing::{info, Level};\nuse tracing_subscriber::FmtSubscriber;\n\nfn main() {\n    // Initialisieren des Subscribers für die Ausgabe von Logs in stdout\n    let subscriber = FmtSubscriber::builder()\n        .with_max_level(Level::INFO)\n        .finish();\n    tracing::subscriber::set_global_default(subscriber)\n        .expect("Fehler beim Setzen des globalen Subscribers");\n\n    // Einfache Nachricht protokollieren\n    info!("Anwendung gestartet!");\n\n    // Aufruf einer Funktion mit Tracing\n    process_data("example.txt");\n}\n\nfn process_data(filename: &str) {\n    // Erstellen eines Spans zur Verfolgung der Funktion\n    let span = tracing::span!(Level::INFO, "process_data", filename = filename);\n    let _guard = span.enter(); // In den Span eintreten\n\n    info!("Beginne Dateiverarbeitung");\n    // ... irgendeine Arbeit ...\n    std::thread::sleep(std::time::Duration::from_millis(100));\n    info!("Verarbeitung abgeschlossen");\n}
\n\n

Beim Start sehen Sie eine strukturierte Ausgabe mit Zeitstempeln, Ebenen und Spannamen.

\n\n

Grundlegende Methoden und Funktionen von Tracing

\n\n

Nachfolgend werden 10 wichtige Funktionen und Makros der Tracing-Bibliothek mit detaillierter Beschreibung und Beispielen vorgestellt.

\n\n

1. tracing::span! — Erstellen eines Spans

\n

Was es tut: Erstellt einen neuen Span – eine logische Arbeitseinheit, die verschachtelt sein kann. Ein Span hat einen Namen, eine Ebene und eine Reihe von Feldern.

\n

Parameter:

\n
    \n
  • Level — Die Logging-Ebene (ERROR, WARN, INFO, DEBUG, TRACE)
  • \n
  • target (optional) — Ein String, der das Modul identifiziert
  • \n
  • field = value — Beliebige Felder für den Kontext
  • \n
\n

Beispiel:

\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 innerhalb des Spans\n    tracing::info!("Verarbeite Anfrage");\n}
\n\n

2. tracing::info! — Logging auf INFO-Ebene

\n

Was es tut: Zeichnet ein Ereignis mit der Ebene INFO auf. Ein Ereignis ist eine einzelne Nachricht, die mit dem aktuellen Span verknüpft sein kann.

\n

Parameter:

\n
    \n
  • Formatierungsstring (wie in format!)
  • \n
  • Argumente für die Formatierung
  • \n
  • Felder über field = value<

Empfehlungen