Rust:
Protokollierung

Wie geht das:

Lassen Sie uns ein grundlegendes Logging-Szenario in Rust mit Hilfe der log-Crate einrichten, die eine Logging-Fassade bietet, und env_logger, einer Logging-Implementierung für die log-Crate. Zuerst fügen Sie diese Ihrem Cargo.toml hinzu:

[dependencies]
log = "0.4.14"
env_logger = "0.9.0"

Jetzt richten Sie den Logger in Ihrer main.rs ein und initialisieren ihn:

use log::{info, warn};

fn main() {
    env_logger::init();

    info!("Das ist eine Info-Nachricht.");
    warn!("Das ist eine Warnmeldung.");
}

Führen Sie Ihre App mit RUST_LOG=info cargo run aus, und Sie werden die Ausgabe sehen:

INFO: Das ist eine Info-Nachricht.
WARN: Das ist eine Warnmeldung.

Experimentieren Sie mit der Umgebungsvariablen RUST_LOG, indem Sie sie auf error, warn, info, debug oder trace setzen, um die Ausführlichkeit Ihrer Logs zu steuern.

Tiefergehende Betrachtung

Das Konzept des Loggings ist nichts Neues; es gibt es seit den frühen Tagen der Computertechnik. Bevor Logging in der Software üblich wurde, verließen sich Entwickler auf primitive Methoden wie Druckanweisungen oder Debugger-Tools, um die Programmausführung nachzuvollziehen. Als Programme komplexer wurden, stieg auch der Bedarf an strukturierten Ansätzen zum Logging.

In Rust abstrahiert die log-Crate die Implementierungsdetails des Loggings, sodass Entwickler verschiedene Logging-Backends einstecken können. Während env_logger eine häufige Wahl ist, gibt es Alternativen wie fern, slog oder tracing, die jeweils ihre eigenen Funktionen und Konfigurationsoptionen haben.

Einige Überlegungen bei der Implementierung von Logging umfassen:

  1. Log-Level: Die Kontrolle der Ausführlichkeit ist entscheidend. Die log-Crate von Rust definiert mehrere Log-Level: error, warn, info, debug und trace in absteigender Reihenfolge der Schwere.

  2. Leistung: Logging kann die Leistung beeinträchtigen. Es ist entscheidend, es wohlüberlegt zu verwenden, insbesondere um Logging in leistungsrelevanten Pfaden zu vermeiden oder übertrieben ausführliche Logs in der Produktion.

  3. Strukturiertes Logging: Moderne Best Practices beinhalten strukturiertes Logging, bei dem Logs in einem maschinenlesbaren Format wie JSON geschrieben werden. Bibliotheken wie slog ermöglichen strukturiertes Logging in Rust, das mit Log-Management-Systemen wie dem ELK Stack oder Splunk indiziert und abgefragt werden kann.

  4. Asynchrones Logging: Um den Einfluss auf die Hauptanwendung zu minimieren, kann Logging asynchron durchgeführt werden. Dies wird oft erreicht, indem die Logging-Bibliothek in eine In-Memory-Warteschlange schreibt und ein separater Thread die Warteschlange verarbeitet und die Logs an das Ziel schreibt.

  5. Konfiguration: Viele Logging-Frameworks unterstützen die Konfiguration über Umgebungsvariablen, Konfigurationsdateien und/oder Code. Diese Flexibilität ist entscheidend für die Feinabstimmung der Ausgabe in verschiedenen Umgebungen (Entwicklung, Staging, Produktion).

Siehe auch