2011-12-16 14 views
3

データバインドされたコントロールを使用してWindowsイベントログからデータを表示するためのASP.NET Webアプリケーションを構築しました。データは、EventLogにアクセスするメディエータクラスに接続されたObjectDataSourceを介して取得されます。 GridViewObjectDataSourceに接続すると、EventLogの行が数えられます。私はこれを簡単かつ迅速に行うことができます:Windowsイベントログを効率的にクエリする

var log = new EventLog {Log = logName}; 
return log.Entries.Count; 

私の非科学的な見解から、O(1)に戻っているようです。ただし、特定の日付より前に発生した、または特定のイベントソースを介して発生したエントリをカウントしたい場合は、効率的なカウント方法を見つけることができません。これは私の合理パワードワークステーション上分のオーダーを取り、70Kのエントリでイベントログの

var query = new ObjectQuery("Select * from Win32_NTLogEvent 
          where LogFile='Application'"); 
var searcher = new ManagementObjectSearcher(query); 
var result = searcher.Get(); 
var foo = result.Count; 

:私のようなWMIクエリを試してみました。それはO(n)のように見えます。私もLinqでlog.Entriesのフィルタリングを試みて、同様の結果を得ました。

これを実行する方法はこれ以上ありませんか?グリッド内の実際のデータについては、log.Entriesをループし、インデックスを介して非常に効果的な方法でエントリのコレクションを取得しています。

答えて

1

.NET 3.5以上を使用している場合は、EventLogQuery classおよび関連するAPIを使用できます。

+0

ありがとうございます。私はこれを試してみる。 –

+0

これは実際には非常に高速ですが、ゲストOSとクエリしているOSがどちらもVista以上のバージョンであることが必要です。私は今この問題に遭遇し、立ち往生した。 – imgen