Logging in Rust: Überblick über die besten Bibliotheken und Werkzeuge

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

Logging für Rust: Die besten Lösungen



Logging ist eine der Schlüsselkomponenten jeder Produktionsanwendung. Im Rust-Ökosystem hat sich ein ausgereifter Werkzeug-Stack etabliert, der eine flexible Konfiguration der Erfassung, Formatierung und Ausgabe von Logs ermöglicht. In diesem Artikel betrachten wir die wichtigsten Bibliotheken, ihre Funktionen und Anwendungsbeispiele.



1. Die Crate log — Abstraktion über das Logging



Die Bibliothek log ist das Fundament des gesamten Logging-Systems in Rust. Sie bietet eine Fassade (facade) — eine Sammlung von Traits und Makros, die nicht von einem bestimmten Backend abhängen. Sie schreiben den Code einmal und konfigurieren die Log-Ausgabe über einen externen Logger.



Wichtige Makros:

  • error! — kritische Fehler
  • warn! — Warnungen
  • info! — Informationsmeldungen
  • debug! — Debug-Informationen
  • trace! — detaillierte Ablaufverfolgung


Anwendungsbeispiel:

use log::{info, warn, error};

fn main() { // Vor der Verwendung muss ein Logger initialisiert werden // env_logger::init(); // oder ein anderes Backend info!("Anwendung gestartet"); warn!("Festplatte zu 90% voll"); error!("Fehler bei der Datenbankverbindung: {:?}", err);}


2. env_logger — Einfachheit und Flexibilität



Das beliebteste Backend für log. Die Konfiguration erfolgt über die Umgebungsvariable RUST_LOG. Dies ist die ideale Wahl für kleine Projekte und Dienstprogramme.



Installation:

[dependencies]log = "0.4"env_logger = "0.11"


Beispiel mit Filterung nach Modulen:

use log::info;

fn main() { env_logger::init(); // Starten Sie mit: RUST_LOG=my_crate=info cargo run info!("Diese Meldung erscheint nur für my_crate"); // RUST_LOG=warn — zeigt nur warn und error // RUST_LOG=debug — zeigt alles, einschließlich debug}


Die Variable RUST_LOG unterstützt komplexe Filter:

  • RUST_LOG=info — Level info und höher
  • RUST_LOG=my_crate=debug,other_crate=warn — verschiedene Level für verschiedene Crates
  • RUST_LOG=off — Logging deaktivieren


3. log4rs — Konfiguration über YAML



Wenn Sie erweiterte Kontrolle benötigen — mehrere Appender (Datei, Konsole, syslog), Log-Rotation, Formatierung — wählen Sie log4rs. Es ist von Java Log4j inspiriert.



Beispielkonfiguration log4rs.yaml:

refresh_rate: 30 seconds

appenders: stdout: kind: console encoder: pattern: "{d(%Y-%m-%d %H:%M:%S)} [{l}] {m}{n}" file: kind: file path: "app.log" encoder: pattern: "{d} {l} {M} - {m}{n}"

root: level: info appenders: - stdout

loggers: app::db: level: debug appenders: - file additive: false


Initialisierung im Code:

use log4rs;

fn main() { log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); log::info!("Logging über YAML konfiguriert"); log::debug!("Diese Meldung geht nur in die Datei");}


Schlüsselfunktionen von log4rs:

  • Log-Rotation nach Größe oder Zeit
  • Verschiedene Appender für verschiedene Module
  • Automatisches Neuladen der Konfiguration
  • Unterstützung des JSON-Formats


4. tracing — Moderner Ansatz



Die Bibliothek tracing vom Tokio-Team ist nicht nur Logging, sondern ein ganzes System zur Diagnose von Anwendungen. Sie unterstützt strukturierte Ereignisse und Spans, was besonders in asynchronen Anwendungen nützlich ist.



Beispiel mit Spans:

use tracing::{in                    

Empfehlungen