2009-05-27 16 views
12

私はリモートマシンからイベントログ(アプリケーション)を読み込むアプリケーションに取り組んでいます。私は.netでEventLogクラスを使用していますが、その後ログエントリを反復処理しますが、これは非常に遅いです。場合によっては、40000以上のログエントリを持つマシンもあれば、そのエントリを繰り返し処理するのに数時間かかることもあります。 このタスクを実行する最も良い方法は何ですか?より速いまたは他の技術では、ネット内に他のクラスがありますか?リモートマシン上のイベントログを読み取る最も速い方法は何ですか?

+0

イベントログ項目を読み込む最良の方法は何か分かりませんが、アーキテクチャの再考をお勧めします。他のいくつかのロギング技術を使用する必要があります!私はエンタープライズライブラリロギングアプリケーションブロックを使用したいと思います。その後、簡単にDBにログインすることができます(イベントログにもログインできます)。その後、DBに対して簡単にクエリを実行できます。 –

+0

私はイベントログにログインしていません。イベントログに記録する複数のアプリケーションがあり、Myアプリケーションはソースコードとイベントコードに基づいてイベントログを検索し、その情報を取得します。 – Kapil

答えて

-1

リモートコンピュータは、コンピューティングの少しを行うことができること。このようにして、サーバーは関連情報のみを処理します。それはリモートコンピュータを使っていくつかの光フィルタリングを行う一種のクラスタであり、サーバは分析部分である。

0

powershell 2.0のリモーティング機能を試したことがありますか?これらを使用すると、リモートマシン上のコマンドレット(イベントログを読み取るコマンドレットなど)を実行し、呼び出しセッションに結果(オブジェクトとして)を返すことができます。

0

ログをファイルに保存してウェブアプリケーションに送信するマシンにプログラムを配置することはできますが、ローカルのループを行うことができますが、それを行う方法はわかりませんもし任意のコード:(

15

男、私はあなたの痛みを感じる。我々は我々のアプリで正確に同じ問題を持っていたが。

あなたのソリューションは、あなたが上で実行しているものをサーバーバージョンに応じて、ブランチとどのようなサーバーバージョンあなたを持っています"ターゲット"マシンが稼働しています。

VistaまたはWindows Server 2008の両方であれば、あなたは幸運です。 System.Diagnostics.Eventing.Reader.EventLogQueryおよびSystem.Diagnostics.Eventing.Reader.EventLogReaderである。これらは.net 3.5で新しく追加されました。

基本的には、XMLでクエリを作成し、リモートコンピュータ上で実行するために配布することができます。特定のタイプのイベント、または特定の時点の新しいイベントを検索しているだけかもしれません。リモートマシン上で検索が実行され、一致するイベントが返されます。新しいクラスは従来の.net 2.0よりはるかに高速ですが、VistaやWindows Server 2008でのみサポートされています。

ターゲットがVista/Win2008上にない場合は、rawをダウンロードしました。 evtファイルをリモートシステムから取得し、バイナリ形式でファイルを解析します。 link textを含む.evtファイル(Vista以前)のイベントログ形式に関するデータのいくつかのソース、およびcodeproject.comでリコールしたC#コードを含む記事があります。

VistaおよびWindows Server 2008マシンでは、新しい形式の新しい.evtx形式が使用されるため、すべてのバージョンで同じバイナリ解析方式を使用することはできません。しかし、新しいEventLogQueryクラスとEventLogReaderクラスは非常に速く、必要ないでしょう。これで、組み込みのクラスを使用するだけでスピードが向上しました。

2

イベントログリーダーは非常に遅いです...遅すぎます。 WTF Microsoft?

LogParser 2.2を使用する - インターネット上でC#とLogParserを検索する(またはコマンドラインからlog parserコマンドを使用する)ことができます。私はすでに他の人が貢献している作品を複製したくありません。

ログをEVTXファイルとしてエクスポートすることによって、リモートシステムからログをプルします。私はリモートシステムからファイルをコピーします。このプロセスは本当に速いです。地球上に広がるネットワークであっても(ログをネットワークリソースにエクスポートすることに問題がありました)いったんローカルにしたら、検索と処理を行うことができます。

EVTXを持っている理由はいくつかあります。なぜ私たちがこれを行うのか理由はわかりません。

次は、ログのコピーをEVTXとして保存するコードの実際の例です。 (注:「device」はネットワークホスト名またはIPです。「LogName」は必要なログの名前です。 outputPathOnRemoteSystemは、 "c:¥temp¥%hostname%。%LogName%。%YYYYMMDD_HH.MM%.evtx"などのリモートコンピュータ上のパスです。

static public bool DumpLog(string device, string LogName, string outputPathOnRemoteSystem, out string errMessage) 
    { 
     bool wasExported = false; 
     string errorMessage = ""; 
     try 
     { 
      System.Diagnostics.Eventing.Reader.EventLogSession els = new System.Diagnostics.Eventing.Reader.EventLogSession(device); 
      els.ExportLogAndMessages(LogName, PathType.LogName, "*", outputPathOnRemoteSystem); 
      wasExported = true; 

     } 
     catch (UnauthorizedAccessException e) 
     { 
      errorMessage = "Unauthorized - Access Denied: " + e.Message; 
     } 
     catch (EventLogNotFoundException e) 
     { 
      errorMessage = "Event Log Not Found: " + e.Message; 
     } 
     catch (EventLogException e) 
     { 
      errorMessage = "Export Failed: " + e.Message + ", Log: " + LogName + ", Device: " + device; 
     } 
     errMessage = errorMessage; 
     return wasExported; 
    } 
2

良い説明/例はMSDNにあります。

EventLogSession session = new EventLogSession(Environment.MachineName); 

// [System/Level=2] filters out the errors 
// Where "Log" is the log you want to get data from. 
EventLogQuery query = new EventLogQuery("Log", PathType.LogName, "*[System/Level=2]"); 

EventLogReader reader = new EventLogReader(query); 

for (EventRecord eventInstance = reader.ReadEvent(); 
    null != eventInstance; 
    eventInstance = reader.ReadEvent()) 
{ 
    // Output or save your event data here. 
} 

古いコードで5〜20分待っているとき、これは10秒以内に行います。

関連する問題