
Windows XML イベントログ (EVTX) フォーマットの高速(かつ安全)なパーサー
Windows XML EventLog 形式のクロスプラットフォームパーサー

インストール不要のオプションをお好みですか? フル機能の EVTX エクスプローラーがブラウザ上で動作します。同じ Rust コアを WebAssembly にコンパイルして使用しています。
👉 今すぐ試す: https://omerbenamram.github.io/evtx/
すべての処理はローカルで行われ、ファイルがマシンの外に出ることはありません。主な特長:
.evtx ファイルをドラッグ&ドロップ(またはクリックして選択) – 非常に大きなログでも処理可能!EventData フィールドに対するファセットフィルター – すべて DuckDB-WASM を利用このビューアは GitHub Pages から静的に提供されており、初回ロード後は完全にオフラインで動作します。
cargo install evtxevtx_dump(バイナリユーティリティ)このクレートに付属する主要なバイナリユーティリティは evtx_dump で、.evtx ファイルをさまざまな出力形式に変換する簡単な方法を提供します。
いくつかの例:
evtx_dump <evtx_file> は evtx レコードの内容を XML として出力します。evtx_dump -o json <evtx_file> は evtx レコードの内容を JSON として出力します。evtx_dump -f <output_file> -o json <input_file> は evtx レコードの内容を JSON として指定されたファイルに出力します。cat <evtx_file> | evtx_dump -o jsonl - は標準入力から EVTX ファイルを読み取ります(パイプや展開に便利)。evtx_dump は fd と組み合わせてファイルの一括処理に便利です:
fd -e evtx -x evtx_dump -o jsonl はフォルダをスキャンし、すべての evtx ファイルを 1 つの jsonlines ファイルに出力します。fd -e evtx -x evtx_dump '{}' -f '{.}.xml' はフォルダ内のすべてのファイルについて、各 evtx ファイルの隣に XML ファイルを作成します。xargs(Mac では gxargs)と jq を使用できます:fd -a -e evtx | xargs -I input sh -c "evtx_dump -o jsonl input | jq --arg path "input" '. + {path: \$path}'"注意: デフォルトでは、evtx_dump はマルチスレッドを利用しようとします。そのため、レコードが順不同で返される可能性があります。
シングルスレッドでの使用を強制するには(これにより順序が保証されます)、-t 1 を渡してください。
EVTX レコードは、プロバイダバイナリ(EXE/DLL/SYS)に保存されたテンプレート定義を参照することがあります。evtx_dump はこれらのテンプレートをオフラインキャッシュに抽出し、レンダリング時に使用できます。
注意: この機能を使用するには、Cargo フィーチャー wevt_templates を有効にして evtx_dump をビルドする必要があります(リリースバイナリには既に含まれている場合があります)。
.wevtcache ファイル):
evtx_dump extract-wevt-templates --input <provider.dll> --output /tmp/wevt_cache.wevtcache --overwriteevtx_dump --wevt-cache /tmp/wevt_cache.wevtcache <log.evtx>デバッグ支援:
TemplateInstance 置換値をダンプ(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>詳細と背景については docs/wevt_templates.md を参照してください(issue #103)。
use evtx::EvtxParser;
use std::path::PathBuf;
// これを .evtx サンプルのパスに変更してください。
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),
}
}
並列バージョンは、フィーチャー "multithreading" を有効にしてコンパイルすると有効になります(デフォルトで有効)。
マルチスレッドを使用する場合、evtx は利用可能な他のどのパーサーよりも大幅に高速です。
シングルコアのパフォーマンスでも、最速であり、XML と JSON の両方の出力に対応する唯一のクロスプラットフォームパーサーです。
パフォーマンスは、hyperfine(統計的測定ツール)を使用して私のマシンでベンチマークしました。
テスト環境:12 コア AMD Ryzen 3900X。
ベンチマーク実行日:2026 年 6 月(evtx 0.12.2)。
OS:Arch Linux(Linux 7.0.11-arch1-1 x86_64)。
ベンチマークコミット:99a6def。
evtx の列、および同じ Rust コアをラップする独自の Python バインディングである pyevtx-rs は、コンパイル済みテンプレートの書き換えが行われた後(docs/compiled-templates.html を参照)、同じマシン上で 2026 年 6 月に再測定されました。どちらも Linux/macOS 向けに出荷される PGO ビルドです(リリースバイナリと PyPI ホイール。詳細は下記)。pyevtx-rs はパーサー自体ではなく、レコードごとの Python マーシャリング(レコードごとに 1 つの dict)によって制約されるため、コアの速度向上を完全には享受していません。残りの競合製品の数値(libevtx, velocidex/evtx, golang-evtx, python-evtx)は、同じハードウェアでの 2026 年 1 月の実行から変更せずに引き継いでいます。これらの外部ツールのパフォーマンスは変わっていません。
ベンチマークしたライブラリ:
python-evtx(https://github.com/williballenthin/python-evtx) - CPython および PyPy でpyevtx-rs(https://github.com/omerbenamram/pyevtx-rs) / evtx(https://pypi.org/project/evtx/) - このライブラリの Python バインディングlibevtx(https://github.com/libyal/libevtx)golang-evtx(https://github.com/0xrawsec/golang-evtx.git) - JSON のみ(マルチスレッドを使用)evtx(https://github.com/Velocidex/evtx) - JSON のみ。evtx(このライブラリ)注: 表示されている数値は real-time 測定値(呼び出しが完了するまでの時間)です。マルチスレッド/マルチプロセスを使用する場合、同期オーバーヘッドのため user-time の測定値は高くなります。
8 スレッドの場合、evtx は python-evtx よりも 7000 倍以上高速に XML ログをダンプします。
この 30MB サンプルでは、スループットは約 8 スレッドで飽和します。シングルスレッドの解析が十分に高速になったため(同じマシンで 2026 年 1 月の数値と比較して約 3.8 倍高速)、30MB ではすべての 24 論理コアをビジー状態に保つのに十分な作業量がなくなりました(24 スレッドは 8 スレッドと同程度で、測定ノイズの範囲内であるため、表では 8 スレッド列を飽和点として強調しています)。この時点で、evtx は同様のマルチスレッド戦略を使用する golang-evtx よりも約 65 倍高速です。
上記の数値は、プロファイルガイド付きビルド(./build_pgo.sh)によるものです。サンプルコーパスでインストルメント化されたバイナリをトレーニングし、そのプロファイルを使用してリビルドします。CI は Linux(x86_64)および macOS リリースバイナリに対してこれを実行するため、表はほとんどの人がダウンロードするアーティファクトを反映しています(出力は通常のビルドとバイト単位で同一です)。PGO は、単純な cargo build --release --features fast-alloc と比較して、シングルスレッドのスループットを約 2~5% 向上させる価値があります(JSON 77.6 → 75 ms、XML 73.0 → 71 ms)。8 スレッド以上ではワークロードが飽和するため、PGO は測定ノイズの範囲内です。
これらのノードでパーサーがエラーになった場合は、遠慮なく issue を開くか、サンプルを添付してメールを送ってください。
以下のいずれかの条件でライセンスされています:
お客様の選択によります。
明示的に別段の表明がない限り、Apache-2.0 ライセンスで定義される、あなたが意図的に本著作物に提出するコントリビューションは、追加の条件なしに上記の通りデュアルライセンスされるものとします。
| evtx (1 スレッド) | evtx (8 スレッド) | evtx (24 スレッド) | libevtx (C) | velocidex/evtx (go) | golang-evtx (マルチプロセス使用) | 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 | 未対応 | 未対応 | 204.6 ms ± 5.7 ms | 2m41.075s (1回実行) | 40.096s (1回実行) |
| 30MB evtx (JSON) | 75.1 ms ± 2.1 ms | 20.5 ms ± 0.8 ms | 20.1 ms ± 0.9 ms | 未対応 | 5.467 s ± 0.038 s | 1.344 s ± 0.005 s | 223.1 ms ± 4.7 ms | 未対応 | 未対応 |