Was ist Tracing und warum wird es in Rust benötigt?
\n\nDie 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\nDas 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\nDie Bibliothek ist Teil des Tokio-Ökosystems und wird aktiv in Projekten wie actix-web, axum, hyper und vielen anderen verwendet.
Installation von Tracing
\n\nUm Tracing zu Ihrem Rust-Projekt hinzuzufügen, öffnen Sie die Datei Cargo.toml und fügen Sie die folgenden Abhängigkeiten hinzu:
[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\nFühren Sie anschließend den Befehl cargo build aus, um die Bibliotheken herunterzuladen und zu kompilieren.
Schnellstart: Erstes Beispiel
\n\nSchreiben wir ein einfaches Programm, das eine Nachricht mit Tracing protokolliert:
\n\nuse 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\nBeim Start sehen Sie eine strukturierte Ausgabe mit Zeitstempeln, Ebenen und Spannamen.
\n\nGrundlegende Methoden und Funktionen von Tracing
\n\nNachfolgend werden 10 wichtige Funktionen und Makros der Tracing-Bibliothek mit detaillierter Beschreibung und Beispielen vorgestellt.
\n\n1. tracing::span! — Erstellen eines Spans
\nWas 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.
\nParameter:
\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
Beispiel:
\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 // Code innerhalb des Spans\n tracing::info!("Verarbeite Anfrage");\n}\n\n2. tracing::info! — Logging auf INFO-Ebene
\nWas 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.
\nParameter:
\n- \n
- Formatierungsstring (wie in
format!) \n - Argumente für die Formatierung \n
- Felder über
field = value<
Auch in der Bibliothek
config für Rust: vollständige Anleitung mit Beispielen
Prometheus-Metriken in Go: Erstellung und Export von Metriken in Golang
Event Bus und das Observer-Pattern in Java: Implementierung einer lose gekoppelten Architektur
Arbeiten mit Bildern in Rust: Überblick über die Bibliotheken image, fast_image_resize und andere
Redis-Client für Java: Jedis, Lettuce und Redisson – Überblick und Beispiele