Normalスタイル
Dockスタイル
先人の方々の素晴らしい努力と開発力により、世の中にはイベントログを閲覧する素晴らしいソフトが生み出されています。
が、ほとんどのソフトは海外製で、Maid in Japanのものはそれほど多くはありません。
そこで、どうせならMade in Japanのイベントログ閲覧ソフトの選択肢を少しでも増やそうではないか!ということで作ってみました。
ファイル構成
EventLogParser.exe:本体
EventLogParser.xml:アプリ設定ファイル
Config - フィルタファイル:フィルタファイル
ReadMe(JP).pdf:日本語説明書
ReadMe(JP).pdf:英語説明書
ダウンロードは以下のGoogleDriveリンク(マウスを乗せると表示される右上の矢印より進んでください)よりお願いします。
※ファイルサイズが異様に大きいのはなぜ?
⇒.NETをはじめとする、アプリの実行に必要なランタイムをすべてバイナリに含んでビルドしているため、一見すると異様にファイルサイズが大きく見えています。
※なぜすべてバイナリに含む形式をとっているの?
⇒私自身、昔からフリーソフトをダウンロードしてウキウキ気分でソフトを起動しようとしたら、特定のDLL(ランタイム)が見つからなくて起動できません、というエラーを何度も見てきました。そのたびにランタイムを探してきてインストールする作業が発生していました。ダウンロードしたらすぐ使いたい!というユーザー目線を考えた結果、どんな環境でも起動できるよう、すべての必要ファイルをバイナリに含ませる形式をとることにしました。
2023/7/4
高DPIでWindows画面の拡大・縮小設定をしている場合にレイアウトが崩れる問題を修正。
2023/4/23
バージョン管理をビルドした日付にした。フレームワークを.NET6から.NET7にした。
2022/5/10
ツリービュー内のローカル端末イベント読み込みアイコンボタンをクリックしても反応しないバグがあったので修正。その他バグ修正。
2022/5/10
一般公開開始しました!よろしくお願いいたしますm(_ _)m
(本アプリの使用に際し発生したいかなる問題に対してもKUMAAは責任を負いません。)
2022/2/19
Normalスタイル時に行フィルタダイアログの閉じるボタンが効かないバグを修正。
デフォルト言語を英語設定に変更(グローバルやねん!)
アプリアイコンを熊さんに変更(クマー)
2022/2/13
PowerShellのイベントログデータ(Event/EventData/Data)が、Name属性が存在しないせいでうまく取得できねーぞ、ゴルァ!というご指摘をいただいたので、原因調査。原因は、.NetのEventingのEventLogPropertySelectorです。このセレクターで、Xpath形式(例えばEvent/EventData/Data[@Name='LogonType'])を指定することで、対応するイベントログ項目を取得できるようになっているのですが、実はこのセレクター、Xpath形式の要素番号指定書式(Event/EventData/Data[1])が効きません。エラーを吐いてしまいます。そのため、Windows PowerShell.evtxのように、Event/EventData/DataにName属性が付与されていないイベントログの項目を取得しようと上記のような番号指定書式を用いてもうまくいきませんでした。実は、原因はEventLogPropertySelectorというよりは、さらにその最下層で実際にたたいているwin32 apiのEvtCreateRenderContextっぽいです。こいつが、Xpath対応と言っておきながら、上記のような番号指定書式を与えるとエラーを吐きます。(誤解のないように申し上げますが、本当にEvtCreateRenderContextが原因かはわかりません。あくまで、c#&.Net環境において、dllimportを使用してEvtCreateRenderContextを使用した際に発生する現象です。実際にネイティブにc++からたたいたらどうなるかはわかりません。)
さて、どうしたものかと考えた結果、「ペイロード機能流用すればいいじゃん!」となりました。今までは取得するペイロード数を指定するのみでしたが、今回、イベントログ個別に取得するペイロード番号を設定する機能を実装しました。これにより、例えばWindows PowerShell.evtxのEvent/EventData/Data[3]を取得したい場合は、Windows PowerShell.evtxの個別ペイロード設定で「3」を指定することにより取得できるようにしました。なお、設定場所については、「ツール⇒アプリ設定⇒フィルタ&イベントログ個別拡張設定」からどうぞ。
ついでに、ノーマルバージョンとDockバージョンを両方保守するのは面倒なため、一つに統合し、設定でスタイルを【ノーマル⇔Dock】で切り替えられるようにしました。「ツール⇒アプリ設定⇒アプリ動作全般⇒Dockモードを使用するチェックボックス」で切り替えできます。(要アプリ再起動)
さて、次回更新あたりで、そろそろパスワード外して一般公開しようかなぁと考え中。
2021/12/25
Dock機能を追加。これにより、不要なウィンドウを非表示にして限られたモニターサイズでの作業を効率的に行うことができるようになったはず。一応、Dock機能追加前のNormalバージョンも遺産として残しておきます。
2021/12/19
細かなバグ修正して再公開
2021/12/12
設定ファイル(EventLogParser.exe.config)を設定するための設定ダイアログを作成。これにより、直接XMLを編集せずともアプリ上の設定画面で簡単に設定できるようになった。(configファイルの形式に手を加えたため、過去の設定ファイルとは互換性がありません)
イベントログをCtrl+Cでコピーした場合も、エクセルに正しく貼り付けられるようにエスケープ処理を追加。
列の表示/非表示を設定できるようにした。
列ヘッダをドラッグして並び替えをできるようにした。
日時記録列のタイムゾーンについてUTC/Localを設定する機能を追加。
言語設定(日本語、英語)を追加。※英語はまだ翻訳途中。
読み込み後のイベントに対して追加でフィルタを適用できるようにした。これにより、不要な列を非表示にしたり、LIKE演算子による正規表現フィルタが可能になった。
イベントログ毎個別に、表示する列項目を設定できるようになった。
なんとなく新しいものは正義、ということで.NET 6で実装した。
どのように設定すればいいかわからない、という方のために、「例えばRDPログを解析したいときはこんな感じに設定したらどうでしょう」というお試しconfigファイルを準備しました。
※ぶっちゃけ、後から機能追加したフィルタ設定機能の方が、従来から備えているフィルタファイルによるフィルタより万倍使いやすい感じになってしまいました。
2021/08/04
列の横位置(左寄、中央寄、右寄)を設定する機能を追加(あいかわらず設定ファイルにカンマ区切りで指定するという雑魚仕様)
すべてのDLLを実行ファイルに含む形でリリース
2021/03/11
イベントログサマリー表示機能を追加
フィルタ設定ダイアログをモーダルからモードレスへ変更
クリップボードへコピー機能を追加
2021/03/02
初公開
保全したEvtxファイルおよびローカル端末のイベントログの読込に対応
古いevt形式は未対応(さすがに今更この形式を見る機会は、、、ないと思うので)
イベントログのメッセージおよび生のXMLをアプリ上に同時表示
ファイルもしくはフォルダをD&Dで読込可能
読み込んだイベントログを結合して横断的な時系列の確認が可能
取得するペイロード数(いわゆるSystem要素以外の、EventData要素等の配下のデータ)を自由に指定可能
Xpath形式で特定の要素を取得指定可能。
イベントログ個別に、取得する要素を指定可能(XPath指定とイベントログ個別指定を上手に使えば、ペイロード設定は無理に使わなくてもいいと思います。)
フィルタクエリファイルを準備することで、イベントログ毎に読み込むデータのフィルタリングが可能
フィルタクエリファイルを用いず、読み込んだ後にフィルタを適用することが可能(こっちの方が使い勝手がいいです。多分。)
一覧表示した列の表示/非表示を切り替え可能
一覧表示した列をドラッグで順番入れ替え可能
読み込んだデータのCSV出力が可能
読み込んだデータの簡易サマリ(記録開始/終了の日時とレコードIDおよびイベント総数)の表示機能
指定したフォルダ配下のイベントログの一括CSV変換が可能
実装はC#と.NET 6
メモリドカ食い気絶部
日本語!(英語もあるよ)
本ソフトは、以下の方々のライブラリやソースコードを参考にさせていただいています。
DataGridViewの行を入れ替える実装について
【C#】マウス操作で行を並び替えに対応させる方法【データグリッドビュー】 | hamalabo
CSV読み書き関係
C# で Listデータ を CSVファイル へ 書き込む 方法 - galife (garafu.blogspot.com)
リッチなXMLテキストエディタライブラリ
RichTextBox with XML formatting and color coding like Visual Studio - CodePlex Archive
DataGridView検索関係
【C#】DataGridView内を検索する | CodeTips (kenhanda.com)
管理者権限におけるD&Dの有効化方法について
VB - Drag and Drop als Administrator (dotnet-snippets.de)
EventLogReaderクラスのReadEvent()メソッドの並列化処理について
c# - Reading Windows Logs efficiently and fast - Stack Overflow
C#からWin32APIをたたく
使用しているアイコン
怖い熊のイラスト | かわいいフリー素材集 いらすとや (irasutoya.com)
Dock機能
NuGet Gallery | DockPanelSuite 3.1.0
本ソフトはC#と.NET 6を用いて作成されています。
C#&.NETでイベントログを処理する場合「System.Diagnostics.Eventing.Reader」を使うのが定石とのことなので、本ソフトもこれを使っています。しかしながら、このクラスを使う場合、致命的な欠点がありました。それは、「メタデータを取得する関数がすこぶる遅い」ということです。例えば、イベントログのメッセージ(ソフトの下に表示される日本語説明文のやつですね)を取得する関数として、FormatDescription()が用意されているのですが、この関数がやたらと遅いのです。内部的にどのように処理しているのか詳しくはわかりませんが。というわけで、メタデータを取得する部分については、
ProviderMetadataインスタンスをシングルトン定義することにより毎回生成されないようにし、オーバーヘッドを減らす
それに伴い、Win32APIのネイティブメソッドEvtFormatMessageをたたくように実装
EvtFormatMessageには、ProviderMetadataと対象イベントのそれぞれのSafeHandleを渡さなきゃいけないらしいが、これらの取得方法がわからなかったので、ProviderMetadataクラスおよびEventLogRecordクラスに隠ぺい実装されているHandleプロパティをリフレクションで無理やり取得(つまり、今後.NETでこの部分の仕様が変われば、本アプリは動かなくなります。)
ReadEvent()メソッドを並列処理することにより多少の読込速度アップ
といった工夫をしているつもりです。
※.NET 5で、上記FormatDescription()の遅さが改善されたようです。しかしながら、他のメタデータ要素についてはなお動作が遅いので、上記の実装を残しています。
CSV出力時は、イベントログを読み取って保持している内部的なインスタンスを出力しています。つまり、アプリ上のDataGridViewで並べ替えをしたからといって、その見た目の通りのCSVが吐き出されるわけではりません。特に、readParallelを有効にして並列読込をした場合には、内部的なインスタンスの時系列はバラバラで読み込んでいるため、出力されるCSVの時系列もバラバラで出力されます。出力時に時系列順に並べ替えるとかすればいいのですが、まぁそこは出力したCSVをエクセルで読み込んでソートすれば事足りることなので、このままでもいいかなと。
一部の要素は見た目がパースされています。例えば、生XMLでは16進数で記録されている値(0x3e7)が、アプリ上は10進数表示(999)になっていたり。これは、イベントログの読み取りに使用している.NETの関数がご丁寧にパースしてくれているからです。本来の生XMLの表記に戻すこともできなくはないですが、個人的に値そのものが変わっているわけではなくあくまでも見た目上の問題なので、このままでもいいかなと。
DataGridViewの値は、内部的にはObject型です。数値型ではないため、ソートが文字列ベースとなります。ようは、1,2,3,4...ではなく、1,10,11,2,3,4...みたいな感じのソートになってしまいます。直そうと思えば直せるのですが、致命傷ではないし、そもそもイベントログのソートで重要なのは記録日時でのソート(これは、日時書式を整えているのでたぶん文字列ベースのソートでもうまくいっているはず)かなと思っているのでどうしたもんだろ、、
ログ読込の進捗表示ダイアログをアクティブにしておくと、処理が微妙に進まずに止まっていることがある。たぶん、スレッド周りの実装が甘いせいだと思われるが現状、原因究明に至っておらず。我ながらショボい。
たまに、日時データ(TimeCreatedSystemTimeFull)のパースに失敗?して空欄になるレコードが発生する。再現性がなく、原因不明。再読み込みすれば治ったりする。我ながらショボい。
基本設定ファイル「EventLogParser.exe.config」については今のところアプリ上でもしくはテキストエディタで開いてXMLを直接編集しないといけないので、ユーザーフレンドリーな設定変更画面を実装したい 2021.12.12版で実装
リモート端末のイベントログの閲覧機能も付けたいところ
Ctrl+Fによる検索機能を実装するかも
クエリフィルタファイルのValidation機能を実装するかも
バグがてんこ盛りだと思うので、もっと安定性を高めたい