
Ein schneller (und sicherer) Parser für das Windows XML Event Log (EVTX)-Format
Ein plattformübergreifender Parser für das Windows XML EventLog-Format

Bevorzugen Sie eine installationsfreie Option? Ein voll ausgestatteter EVTX-Explorer läuft direkt in Ihrem Browser, unterstützt von demselben Rust-Kern, der zu WebAssembly kompiliert wurde.
👉 Jetzt ausprobieren: https://omerbenamram.github.io/evtx/
Alles geschieht lokal – Dateien verlassen niemals Ihren Rechner. Highlights:
.evtx-Dateien (oder Klicken zum Durchsuchen) – verarbeitet auch sehr große Logs!EventData-Felder – alle unterstützt durch DuckDB-WASMDer Viewer wird statisch von GitHub Pages ausgeliefert; nach dem ersten Laden funktioniert er vollständig offline.
cargo install evtxevtx_dump (Binärprogramm):Das wichtigste Binärprogramm, das mit dieser Crate bereitgestellt wird, ist evtx_dump, und es bietet eine schnelle Möglichkeit, .evtx-Dateien in verschiedene Ausgabeformate zu konvertieren.
Einige Beispiele
evtx_dump <evtx_datei> gibt den Inhalt der EVTX-Datensätze als XML aus.evtx_dump -o json <evtx_datei> gibt den Inhalt der EVTX-Datensätze als JSON aus.evtx_dump -f <ausgabedatei> -o json <eingabedatei> gibt den Inhalt der EVTX-Datensätze als JSON in eine bestimmte Datei aus.cat <evtx_datei> | evtx_dump -o jsonl - liest die EVTX-Datei von der Standardeingabe (nützlich für Piping/Dekompression).evtx_dump kann mit fd für die bequeme Stapelverarbeitung von Dateien kombiniert werden:
fd -e evtx -x evtx_dump -o jsonl durchsucht einen Ordner und gibt alle EVTX-Dateien in eine einzige JSON-Lines-Datei aus.fd -e evtx -x evtx_dump '{}' -f '{.}.xml' erstellt neben jeder EVTX-Datei eine XML-Datei, und zwar für alle Dateien im Ordner rekursiv!xargs (oder gxargs auf dem Mac) und jq verwendet werden: fd -a -e evtx | xargs -I input sh -c "evtx_dump -o jsonl input | jq --arg path "input" '. + {path: \$path}'"Hinweis: Standardmäßig versucht evtx_dump, Multithreading zu nutzen. Das bedeutet, dass die Datensätze möglicherweise in falscher Reihenfolge zurückgegeben werden.
Um eine Single-Thread-Nutzung zu erzwingen (die auch die Reihenfolge sicherstellt), kann -t 1 übergeben werden.
EVTX-Datensätze können auf Template-Definitionen verweisen, die in Anbieter-Binärdateien (EXE/DLL/SYS) gespeichert sind. evtx_dump kann diese Templates in einen Offline-Cache extrahieren und sie zur Renderzeit verwenden.
Hinweis: Diese Funktionalität erfordert das Erstellen von evtx_dump mit dem Cargo-Feature wevt_templates (Release-Binärdateien enthalten es möglicherweise bereits).
.wevtcache-Datei):
evtx_dump extract-wevt-templates --input <anbieter.dll> --output /tmp/wevt_cache.wevtcache --overwriteevtx_dump --wevt-cache /tmp/wevt_cache.wevtcache <log.evtx>Debugging-Hilfen:
TemplateInstance eines Datensatzes ausgeben (JSONL):
evtx_dump dump-template-instances --input <log.evtx> --record-id <ID> | head -n1evtx_dump apply-wevt-cache --cache /tmp/wevt_cache.wevtcache --template-guid <GUID> --evtx <log.evtx> --record-id <ID>Siehe docs/wevt_templates.md für Details und Hintergrund (Issue #103).
use evtx::EvtxParser;
use std::path::PathBuf;
// Change this to a path of your .evtx sample.
let fp = PathBuf::from(format!("{}/samples/security.evtx", std::env::var("CARGO_MANIFEST_DIR").unwrap()));
let mut parser = EvtxParser::from_path(fp).unwrap();
for record in parser.records() {
match record {
Ok(r) => println!("Record {}\n{}", r.event_record_id, r.data),
Err(e) => eprintln!("{}", e),
}
}
Die parallele Version ist aktiviert, wenn mit dem Feature "multithreading" kompiliert wird (standardmäßig aktiviert).
Bei Verwendung von Multithreading ist evtx deutlich schneller als jeder andere verfügbare Parser.
Für die Single-Core-Leistung ist es sowohl der schnellste als auch der einzige plattformübergreifende Parser, der sowohl XML- als auch JSON-Ausgaben unterstützt.
Die Leistung wurde auf meinem Rechner mit hyperfine (statistisches Messwerkzeug) gemessen.
Ich führe Tests auf einem 12-Kern AMD Ryzen 3900X durch.
Bench-Lauf: Juni 2026 (evtx 0.12.2).
System: Arch Linux (Linux 7.0.11-arch1-1 x86_64).
Benchmark-Commit: 99a6def.
Die evtx-Spalten – und pyevtx-rs, unsere eigenen Python-Bindings, die denselben Rust-Kern verwenden – wurden im Juni 2026 auf demselben Rechner neu gemessen, nachdem die kompilierte Template-Neufassung eingeführt wurde (siehe docs/compiled-templates.html). Beides sind die PGO-Builds, die für Linux/macOS ausgeliefert werden (das Release-Binary und das PyPI-Wheel; Details unten). pyevtx-rs ist durch das Marshalling pro Datensatz (ein Dict pro Datensatz) eingeschränkt, nicht durch den Parser, sodass es die volle Kern-Beschleunigung nicht sieht. Die verbleibenden Konkurrenzwerte (libevtx, velocidex/evtx, golang-evtx, python-evtx) sind unverändert aus dem Januar-2026-Lauf auf derselben Hardware übernommen – externe Werkzeuge, deren Leistung sich nicht geändert hat.
Verglichene Bibliotheken:
python-evtx(https://github.com/williballenthin/python-evtx) - Mit CPython und PyPypyevtx-rs(https://github.com/omerbenamram/pyevtx-rs) / evtx(https://pypi.org/project/evtx/) - Python-Bindings für diese Bibliotheklibevtx(https://github.com/libyal/libevtx)golang-evtx(https://github.com/0xrawsec/golang-evtx.git) - nur JSON (verwendet Multithreading)evtx(https://github.com/Velocidex/evtx) - nur JSON.evtx (Diese Bibliothek)Hinweis: Die gezeigten Zahlen sind real-time-Messungen (Zeit, die der Aufruf benötigt). user-time-Messungen sind bei Verwendung von Multithreading/Multiprozessing aufgrund des Synchronisationsaufwands höher.
Mit 8 Threads ist evtx mehr als 7000x schneller als python-evtx beim Ausgeben von XML-Logs.
Der Durchsatz sättigt bei diesem 30MB-Beispiel bei etwa 8 Threads: Single-Threaded-Parsing ist schnell genug (etwa 3,8x schneller als die Januar-2026-Zahlen auf demselben Rechner), sodass 30MB nicht mehr genug Arbeit bietet, um alle 24 logischen Kerne auszulasten – 24 Threads sind nicht schneller als 8 (die beiden liegen innerhalb der Messungenauigkeit, daher hebt die Tabelle die 8-Thread-Spalte als Sättigungspunkt hervor). An diesem Punkt ist evtx etwa 65x schneller als golang-evtx, das eine ähnliche Multithreading-Strategie verwendet.
Die obigen Zahlen stammen von einem profilgesteuerten Build (./build_pgo.sh): Es trainiert ein instrumentiertes Binary auf dem Beispielkorpus und erstellt dann mit diesem Profil neu. CI führt dies für die Linux (x86_64)- und macOS-Release-Binaries aus, sodass die Tabelle das Artefakt widerspiegelt, das die meisten Leute herunterladen (die Ausgabe ist byteidentisch mit einem normalen Build). PGO bringt etwa 2–5 % Single-Threaded-Durchsatz gegenüber einem einfachen cargo build --release --features fast-alloc (JSON 77.6 → 75 ms, XML 73.0 → 71 ms); bei 8+ Threads ist die Arbeitslast sättigungsgebunden, sodass PGO dort innerhalb der Messungenauigkeit liegt.
Wenn der Parser bei einem dieser Knoten einen Fehler ausgibt, können Sie gerne ein Issue eröffnen oder mir eine E-Mail mit einem Beispiel schicken.
Lizenziert unter einer der folgenden Lizenzen:
nach Ihrer Wahl.
Sofern Sie nicht ausdrücklich etwas anderes erklären, wird jeder Beitrag, den Sie absichtlich zur Aufnahme in das Werk einreichen, wie von Ihnen im Sinne der Apache-2.0-Lizenz definiert, unter den oben genannten Lizenzen dual lizenziert, ohne zusätzliche Bedingungen oder Klauseln.
| evtx (1 Thread) | evtx (8 Threads) | evtx (24 Threads) | libevtx (C) | velocidex/evtx (go) | golang-evtx (verwendet Multiprozessing) | pyevtx-rs (CPython 3.14.5) | python-evtx (CPython 3.13.11) | python-evtx (PyPy 7.3.19) |
|---|
| 30MB evtx (XML) | 71.6 ms ± 1.8 ms | 20.7 ms ± 1.0 ms | 22.1 ms ± 1.7 ms | 2.439 s ± 0.035 s | Keine Unterstützung | Keine Unterstützung | 204.6 ms ± 5.7 ms | 2m41.075s (einmal ausgeführt) | 40.096s (einmal ausgeführt) |
| 30MB evtx (JSON) | 75.1 ms ± 2.1 ms | 20.5 ms ± 0.8 ms | 20.1 ms ± 0.9 ms | Keine Unterstützung | 5.467 s ± 0.038 s | 1.344 s ± 0.005 s | 223.1 ms ± 4.7 ms | Keine Unterstützung | Keine Unterstützung |