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 Fehlerwarn!— Warnungeninfo!— Informationsmeldungendebug!— Debug-Informationentrace!— 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öherRUST_LOG=my_crate=debug,other_crate=warn— verschiedene Level für verschiedene CratesRUST_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: falseInitialisierung 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 Auch in der Bibliothek
Kysely TypeScript: Vollständiges Tutorial mit Codebeispielen
Arbeit mit YAML in C# (.NET): Bibliotheken und Anwendungsbeispiele
migrate für Go: Vollständige Anleitung mit Beispielen