ここでは、コンピュータ上のWindowsのイベントログとその内容(エントリ)を取得する方法を紹介します。
EventLog.GetEventLogsメソッドを使うと、コンピュータ上のすべてのイベントログ(Application, Security, System, ...)を配列で取得できます。イベントログの内容(エントリ)は、EventLog.Entriesプロパティで取得できます。
なおWindows Vista以降でUACが有効になっている時は、管理者に昇格しないと失敗するかもしれません。この対処法については、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。
次の例ではローカルコンピュータ上のすべてのイベントログとエントリを取得してコンソールへ出力しています。(ログが多いと、終わるまでにかなり時間がかかります。)
'ローカルコンピュータ上のイベントログをすべて取得する Dim logs As System.Diagnostics.EventLog() = _ System.Diagnostics.EventLog.GetEventLogs() '次のようにコンピュータ名を指定することも出来る 'logs = System.Diagnostics.EventLog.GetEventLogs("myMachine") For Each log As System.Diagnostics.EventLog In logs 'イベントログの名前を出力する Console.WriteLine(("Log: " & log.Log)) 'ログエントリをすべて取得する For Each entry As System.Diagnostics.EventLogEntry In log.Entries 'ログエントリのメッセージを出力する Console.WriteLine(vbTab & "Entry: " & entry.Message) Next Next End Sub
//ローカルコンピュータ上のイベントログをすべて取得する System.Diagnostics.EventLog[] logs = System.Diagnostics.EventLog.GetEventLogs(); //次のようにコンピュータ名を指定することも出来る //logs = System.Diagnostics.EventLog.GetEventLogs("myMachine"); foreach (System.Diagnostics.EventLog log in logs) { //イベントログの名前を出力する Console.WriteLine(("Log: " + log.Log)); //ログエントリをすべて取得する foreach (System.Diagnostics.EventLogEntry entry in log.Entries) { //ログエントリのメッセージを出力する Console.WriteLine("\tEntry: " + entry.Message); } }
上記のようにすべてのイベントログではなく、名前が分かっている特定のイベントログだけを取得するならば、その名前とコンピュータ名をコンストラクタの引数に指定して、EventLogオブジェクトを作成します。
以下の例では、ローカルコンピュータ上のイベントログ「Application」のエントリをすべて表示しています。
'取得するイベントログ名 Dim logName As String = "Application" 'コンピュータ名("."はローカルコンピュータ) Dim machineName As String = "." '指定したイベントログが存在しているか調べる If System.Diagnostics.EventLog.Exists(logName, machineName) Then 'EventLogオブジェクトを作成する Dim log As New System.Diagnostics.EventLog(logName, machineName) 'または、次のようにもできる 'Dim log As New System.Diagnostics.EventLog() 'log.Log = logName 'log.MachineName = machineName 'ログエントリをすべて取得する For Each entry As System.Diagnostics.EventLogEntry In log.Entries 'ログエントリのメッセージを出力する Console.WriteLine("Entry: " & entry.Message) Next '閉じる log.Close() End If
//取得するイベントログ名 string logName = "Application"; //コンピュータ名("."はローカルコンピュータ) string machineName = "."; //指定したイベントログが存在しているか調べる if (System.Diagnostics.EventLog.Exists(logName, machineName)) { //EventLogオブジェクトを作成する System.Diagnostics.EventLog log = new System.Diagnostics.EventLog(logName, machineName); //または、次のようにもできる //System.Diagnostics.EventLog log = // new System.Diagnostics.EventLog(); //log.Log = logName; //log.MachineName = machineName; //ログエントリをすべて取得する foreach (System.Diagnostics.EventLogEntry entry in log.Entries) { //ログエントリのメッセージを出力する Console.WriteLine("Entry: " + entry.Message); } //閉じる log.Close(); }