
Un analyseur rapide (et sûr) pour le format de journal d'événements XML Windows (EVTX)
Un analyseur multiplateforme pour le format Windows XML EventLog

Vous préférez une option sans installation ? Un explorateur EVTX complet s'exécute directement dans votre navigateur, propulsé par le même noyau Rust compilé en WebAssembly.
👉 Essayez-le maintenant : https://omerbenamram.github.io/evtx/
Tout se passe localement – les fichiers ne quittent jamais votre machine. Points forts :
.evtx (ou cliquez pour parcourir) – gère de très gros fichiers journaux !EventData dynamiques – tous soutenus par DuckDB‑WASMLe visualiseur est servi statiquement depuis GitHub Pages ; après le premier chargement, il fonctionne complètement hors ligne.
cargo install evtxevtx_dump (Utilitaire binaire) :L'utilitaire binaire principal fourni avec cette crate est evtx_dump, et il offre un moyen rapide de convertir des fichiers .evtx en différents formats de sortie.
Quelques exemples
evtx_dump <evtx_file> exportera le contenu des enregistrements evtx en xml.evtx_dump -o json <evtx_file> exportera le contenu des enregistrements evtx en JSON.evtx_dump -f <output_file> -o json <input_file> exportera le contenu des enregistrements evtx en JSON vers un fichier donné.cat <evtx_file> | evtx_dump -o jsonl - lira le fichier EVTX depuis stdin (utile pour le pipe/décompression).evtx_dump peut être combiné avec fd pour un traitement par lots pratique des fichiers :
fd -e evtx -x evtx_dump -o jsonl analysera un dossier et exportera tous les fichiers evtx vers un seul fichier jsonlines.fd -e evtx -x evtx_dump '{}' -f '{.}.xml' créera un fichier xml à côté de chaque fichier evtx, pour tous les fichiers du dossier de manière récursive !xargs (ou gxargs sur mac) et jq peuvent être utilisés : fd -a -e evtx | xargs -I input sh -c "evtx_dump -o jsonl input | jq --arg path "input" '. + {path: \$path}'"Remarque : par défaut, evtx_dump essaiera d'utiliser le multithreading, ce qui signifie que les enregistrements peuvent être retournés dans le désordre.
Pour forcer l'utilisation d'un seul thread (ce qui garantira également l'ordre), -t 1 peut être passé.
Les enregistrements EVTX peuvent référencer des définitions de modèle stockées dans les binaires du fournisseur (EXE/DLL/SYS). evtx_dump peut extraire ces modèles dans un cache hors ligne et les utiliser au moment du rendu.
Remarque : cette fonctionnalité nécessite de construire evtx_dump avec la fonctionnalité Cargo wevt_templates (les binaires de version peuvent déjà l'inclure).
.wevtcache portable unique) :
evtx_dump extract-wevt-templates --input <provider.dll> --output /tmp/wevt_cache.wevtcache --overwriteevtx_dump --wevt-cache /tmp/wevt_cache.wevtcache <log.evtx>Aides au débogage :
TemplateInstance d'un enregistrement (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>Voir docs/wevt_templates.md pour les détails et le contexte (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),
}
}
La version parallèle est activée lors de la compilation avec la fonctionnalité "multithreading" (activée par défaut).
En utilisant le multithreading - evtx est significativement plus rapide que tout autre analyseur disponible.
Pour les performances monocœur, il est à la fois le plus rapide et le seul analyseur multiplateforme qui prend en charge les sorties xml et JSON.
Les performances ont été mesurées sur ma machine avec hyperfine (outil de mesures statistiques).
Je lance les tests sur un AMD Ryzen 3900X 12 cœurs.
Exécution du benchmark : Juin 2026 (evtx 0.12.2).
Système : Arch Linux (Linux 7.0.11-arch1-1 x86_64).
Commit du benchmark : 99a6def.
Les colonnes evtx — et pyevtx-rs, nos propres liaisons Python, qui encapsulent le même noyau Rust — ont été remesurées en Juin 2026 sur cette même machine, après l'arrivée de la réécriture des modèles compilés (voir docs/compiled-templates.html). Les deux sont les builds PGO qui sont livrés pour Linux/macOS (le binaire de version et la roue PyPI ; détails ci-dessous). pyevtx-rs est limité par le marshaling Python par enregistrement (un dict par enregistrement) plutôt que par l'analyseur, donc il ne voit pas l'accélération complète du noyau. Les chiffres des concurrents restants (libevtx, velocidex/evtx, golang-evtx, python-evtx) sont repris inchangés de l'exécution de Janvier 2026 sur le même matériel — des outils externes dont les performances n'ont pas changé.
Bibliothèques testées :
python-evtx(https://github.com/williballenthin/python-evtx) - Avec CPython et PyPypyevtx-rs(https://github.com/omerbenamram/pyevtx-rs) / evtx(https://pypi.org/project/evtx/) - Liaisons Python pour cette bibliothèquelibevtx(https://github.com/libyal/libevtx)golang-evtx(https://github.com/0xrawsec/golang-evtx.git) - seulement JSON (utilise le multithreading)evtx(https://github.com/Velocidex/evtx) - seulement JSON.evtx (Cette bibliothèque)Remarque : les nombres affichés sont des mesures de temps réel (temps nécessaire pour terminer l'invocation). Les mesures de temps utilisateur sont plus élevées lors de l'utilisation du multithreading/multiprocessing, en raison de la surcharge de synchronisation.
Avec 8 threads - evtx est plus de 7000x plus rapide que python-evtx lorsqu'il exporte des journaux xml.
Le débit sature désormais à environ 8 threads sur cet échantillon de 30 Mo : l'analyse monothread est devenue suffisamment rapide (~3,8 fois plus rapide que les chiffres de janvier 2026, sur la même machine) pour que 30 Mo ne contiennent plus assez de travail pour occuper les 24 cœurs logiques — 24 threads ne sont pas plus rapides que 8 (les deux sont dans le bruit de mesure, donc le tableau met en évidence la colonne 8 threads comme point de saturation). À ce stade, evtx est environ 65x plus rapide que golang-evtx, qui utilise une stratégie de multithreading similaire.
Les chiffres ci-dessus proviennent d'une build guidée par profil (./build_pgo.sh) : elle entraîne un binaire instrumenté sur le corpus d'échantillons, puis reconstruit avec ce profil. CI exécute cela pour les binaires de version Linux (x86_64) et macOS, donc le tableau reflète l'artefact que la plupart des gens téléchargent (la sortie est identique octet par octet à une build normale). PGO apporte environ 2 à 5 % de débit monothread par rapport à un simple cargo build --release --features fast-alloc (JSON 77,6 → 75 ms, XML 73,0 → 71 ms) ; à 8+ threads, la charge de travail est limitée par saturation, donc PGO y est dans le bruit de mesure.
Si l'analyseur génère une erreur sur l'un de ces nœuds, n'hésitez pas à ouvrir un problème ou à m'envoyer un email avec un échantillon.
Sous licence selon l'une ou l'autre des
à votre discrétion.
Sauf indication contraire explicite de votre part, toute contribution intentionnellement soumise pour inclusion dans le travail par vous, telle que définie dans la licence Apache-2.0, sera doublement licenciée comme ci-dessus, sans aucun terme ou condition supplémentaire.
| evtx (1 thread) | evtx (8 threads) | evtx (24 threads) | libevtx (C) | velocidex/evtx (go) | golang-evtx (uses multiprocessing) | 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 | No support | No support | 204.6 ms ± 5.7 ms | 2m41.075s (ran once) | 40.096s (ran once) |
| 30MB evtx (JSON) | 75.1 ms ± 2.1 ms | 20.5 ms ± 0.8 ms | 20.1 ms ± 0.9 ms | No support | 5.467 s ± 0.038 s | 1.344 s ± 0.005 s | 223.1 ms ± 4.7 ms | No support | No support |