質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

11507閲覧

C#のEventLogReaderで任意の日付から読み込みを開始したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2017/01/31 07:03

C#でイベントログを読み込む処理を作っています。
読み込み自体はできるようになったのですが、処理時間短縮のため、
指定した日時から読み込みを開始したいです。
まずは以下のコードを見てください。

C#

1//FilterXPathを指定 2string queryString = @"*[System[Provider[@Name='WSH']]]"; 3//イベントログのフルパス(アーカイブファイル) 4string eventLogLocation = eventLogFileInfo.FullName; 5EventLogQuery eventsQuery = 6 new EventLogQuery(eventLogLocation, PathType.FilePath, queryString); 7EventLogReader logReader = new EventLogReader(eventsQuery); 8 9for (EventRecord eventInstance = logReader.ReadEvent(); 10 null != eventInstance; eventInstance = logReader.ReadEvent()) 11{ 12 //負荷を下げるために1[ms]待機 13 Tread.Sleep(1); 14 //読み込み対象期間内のイベントログのメッセージのみをList<string>に格納 15 if (eventInstance.TimeCreated >= startDateTime && eventInstance.TimeCreated < endDateTime) 16 { 17 list.Add(eventInstance.FormatDescription().ToString()); 18 count++; 19 } 20 //読み込み対象期間を過ぎたら処理終了 21 if (endDateTime <= eventInstance.TimeCreated) 22 { 23 break; 24 } 25}

処理内容は上記の通り、イベントログ(アーカイブ)ファイルから
ソース名:WSHで指定した期間内のログのメッセージ部を取得し、
List<string>に格納する処理です。

ここで、EventLogReaderは指定したファイル内の一番古いレコードから順に読んでいきます。
なので指定期間の始点が新しいと、読み込みに時間がかかります。
特にアーカイブファイルは1GBあるので高速に読むとCPU負荷が高くなるので、Sleepを入れて負荷を下げるようにしています。
この場合一番古いレコードから順に読んでいくと、
処理に時間がかかるので、CPUの負荷を上げずに処理時間を短縮したいです。

EventLogReaderでEventBookmarkというものをSeekメソッドに渡すことで、
実現できそうな気がするのですが、日付を指定するとかそういったものではなさそうで、
使い方も知識不足でよくわかりません。。。
素直にFilterXPathに期間指定したほうがいいのでしょうが、
FilterXPathで期間指定するのは使い勝手が悪く、億劫になっていました。
(特に日付の書き方)

EventLogReaderで指定した日付から読み込みを開始する方法、
何かご存じありませんでしょうか?

ご教示のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

全く触ったことないから、間違ってたらごめんなさい。
ググってみるとSystem[TimeCreated[@SystemTime = ~といったものがあり、こいつをクエリに追加して試してみてはいかがでしょう。試したことないからわかりませんが、この日時の指定の仕方はこのフォーマットでないとだめっぽい?ここみるとDatetime型の.ToUniversalTime().ToString("o")で得られるようです。

投稿2017/01/31 07:28

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

queryString で取得する日付の範囲を指定できるそうです。
EventLog XML Query Filter Date Range

投稿2017/01/31 07:13

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問