
Un parser veloce (e sicuro) per il formato Windows XML Event Log (EVTX)
Un parser multipiattaforma per il formato Windows XML EventLog

Preferisci un'opzione senza installazione? Un esploratore EVTX completo funziona direttamente nel tuo browser, alimentato dallo stesso core Rust compilato in WebAssembly.
👉 Provalo ora: https://omerbenamram.github.io/evtx/
Tutto avviene localmente – i file non lasciano mai la tua macchina. Caratteristiche principali:
.evtx (o clicca per sfogliare) – gestisce log molto grandi!EventData dinamici – tutto supportato da DuckDB-WASMIl visualizzatore è servito staticamente da GitHub Pages; dopo il primo caricamento funziona completamente offline.
cargo install evtxevtx_dump (Utilità binaria):L'utilità binaria principale fornita con questa crate è evtx_dump e fornisce un modo rapido per convertire file .evtx in diversi formati di output.
Alcuni esempi
evtx_dump <evtx_file> scaricherà il contenuto dei record evtx come xml.evtx_dump -o json <evtx_file> scaricherà il contenuto dei record evtx come JSON.evtx_dump -f <output_file> -o json <input_file> scaricherà il contenuto dei record evtx come JSON in un file specificato.cat <evtx_file> | evtx_dump -o jsonl - leggerà il file EVTX da stdin (utile per piping/decompressione).evtx_dump può essere combinato con fd per l'elaborazione batch conveniente dei file:
fd -e evtx -x evtx_dump -o jsonl scansionerà una cartella e scaricherà tutti i file evtx in un unico file jsonlines.fd -e evtx -x evtx_dump '{}' -f '{.}.xml' creerà un file xml accanto a ciascun file evtx, per tutti i file nella cartella in modo ricorsivo!xargs (o gxargs su mac) e jq: fd -a -e evtx | xargs -I input sh -c "evtx_dump -o jsonl input | jq --arg path "input" '. + {path: \$path}'"Nota: per impostazione predefinita, evtx_dump tenterà di utilizzare il multithreading, il che significa che i record potrebbero essere restituiti fuori ordine. Per forzare l'uso a thread singolo (che garantirà anche l'ordine), si può passare -t 1.
I record EVTX possono fare riferimento a definizioni di template memorizzate in binari di provider (EXE/DLL/SYS). evtx_dump può estrarre questi template in una cache offline e usarli al momento del rendering.
Nota: questa funzionalità richiede la compilazione di evtx_dump con la feature Cargo wevt_templates (le versioni binarie potrebbero già includerla).
.wevtcache portatile):
evtx_dump extract-wevt-templates --input <provider.dll> --output /tmp/wevt_cache.wevtcache --overwriteevtx_dump --wevt-cache /tmp/wevt_cache.wevtcache <log.evtx>Aiuti per il debug:
TemplateInstance di un record (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>Vedi docs/wevt_templates.md per dettagli e background (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 versione parallela è abilitata durante la compilazione con la feature "multithreading" (abilitata per impostazione predefinita).
Quando si utilizza il multithreading - evtx è significativamente più veloce di qualsiasi altro parser disponibile.
Per le prestazioni single-core, è sia il più veloce che l'unico parser multipiattaforma che supporta output sia xml che JSON.
Le prestazioni sono state misurate sulla mia macchina usando hyperfine (strumento di misurazione statistica).
Sto eseguendo i test su un AMD Ryzen 3900X a 12 core.
Esecuzione del benchmark: Giugno 2026 (evtx 0.12.2).
Sistema: Arch Linux (Linux 7.0.11-arch1-1 x86_64).
Commit del benchmark: 99a6def.
Le colonne evtx — e pyevtx-rs, i nostri binding Python, che incapsulano lo stesso core Rust — sono state rimisurate a Giugno 2026 sulla stessa macchina, dopo il rilascio della riscrittura del template compilato (vedi docs/compiled-templates.html). Entrambe sono le build PGO fornite per Linux/macOS (il binario di rilascio e la wheel PyPI; dettagli sotto). pyevtx-rs è limitato dalla marshalling Python per record (un dict per record) piuttosto che dal parser, quindi non vede il pieno aumento di velocità del core. Le restanti cifre dei concorrenti (libevtx, velocidex/evtx, golang-evtx, python-evtx) sono riprese invariate dall'esecuzione di Gennaio 2026 sullo stesso hardware — strumenti esterni le cui prestazioni non sono cambiate.
Librerie misurate:
python-evtx(https://github.com/williballenthin/python-evtx) - Con CPython e PyPypyevtx-rs(https://github.com/omerbenamram/pyevtx-rs) / evtx(https://pypi.org/project/evtx/) - Binding Python per questa librerialibevtx(https://github.com/libyal/libevtx)golang-evtx(https://github.com/0xrawsec/golang-evtx.git) - solo JSON (usa multithreading)evtx(https://github.com/Velocidex/evtx) - solo JSON.evtx (Questa libreria)Nota: i numeri mostrati sono misurazioni real-time (tempo impiegato per completare l'invocazione). Le misurazioni user-time sono più elevate quando si utilizza più multithreading/multiprocessing, a causa del sovraccarico di sincronizzazione.
Con 8 thread - evtx è più di 7000x più veloce di python-evtx durante lo scaricamento di log xml.
La produttività ora satura intorno agli 8 thread su questo campione di 30 MB: l'analisi single-thread è diventata abbastanza veloce (~3.8x più veloce dei numeri di Gennaio 2026, sulla stessa macchina) che 30 MB non contiene più abbastanza lavoro per tenere occupati tutti i 24 core logici — 24 thread non sono più veloci di 8 (i due sono entro il rumore di misurazione, quindi la tabella evidenzia la colonna a 8 thread come punto di saturazione). A quel punto evtx è circa 65x più veloce di golang-evtx, che utilizza una strategia di multithreading simile.
I numeri sopra provengono da una build guidata dal profilo (./build_pgo.sh): allena un binario strumentato sul corpus di campioni, quindi ricostruisce con quel profilo. CI esegue questo per i binari di rilascio Linux (x86_64) e macOS, quindi la tabella riflette l'artefatto che la maggior parte delle persone scarica (l'output è byte-identico a una build normale). PGO vale circa 2-5% di produttività single-thread rispetto a un semplice cargo build --release --features fast-alloc (JSON 77.6 → 75 ms, XML 73.0 → 71 ms); a 8+ thread il carico di lavoro è saturato, quindi PGO in quel caso è entro il rumore di misurazione.
Se il parser segnala errori su uno di questi nodi, sentiti libero di aprire un issue o inviarmi una email con un campione.
Concesso in licenza sotto uno dei seguenti:
a tua scelta.
Salvo che tu non dichiari esplicitamente il contrario, qualsiasi contributo inviato intenzionalmente per l'inclusione nel lavoro da te, come definito nella licenza Apache-2.0, sarà concesso in doppia licenza come sopra, senza termini o condizioni aggiuntivi.
| evtx (1 thread) | evtx (8 threads) | evtx (24 threads) | libevtx (C) | velocidex/evtx (go) | golang-evtx (usa 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 |