イベントビューアー作成中③(イベント取得表示)

Eventlog

XMLについて2部を使って説明しましたが、いよいよイベントログの取得編です。

パソコンの設定によってはログが少ない人多い人とありますが、ログ全取得約4万件で10秒程で現行表示しております。

System.Diagnostics.EventLog[] evlogs = System.Diagnostics.EventLog.GetEventLogs();
//ループでログの名前を取得
foreach (System.Diagnostics.EventLog logname in evlogs)
{
  //ログの表示名称を取得し
   var strLog = logname.Log;
}
System.Diagnostics.EventLog evLog = new System.Diagnostics.EventLog("イベントの種類");
//種類:Application、HardwareEvents、Internet Explorer、Key Management Service、Security、System、Windows Azure、Windows PowerShell
//一部管理権限で実行しないと表示できません。
            IEnumerable<ViewDate> sources = (from System.Diagnostics.EventLogEntry es in evLog.Entries
                           where es.TimeWritten >= dt1.Date 
                           orderby es.TimeGenerated descending
                           select  new ViewDate{ Level = es.EntryType.ToString() 
                                       , TimeWritten = es.TimeWritten
                                       , Source = es.Source
                                       , EventID = es.EventID
                                       , Category = es.Category
                                       , Message = es.Message
                                       , MachineName = es.MachineName
                                       , UserName = es.UserName
                                      });

ログを格納するクラスの作成

クラスをあらかじめ用意しておくと取得スピードが異なるため用意しておきます。検証などは検索していただくとたくさん記事があるので、調べてみてください。

public class ViewDate
{
    public string Level { get; set; }
    public DateTime TimeWritten { get; set; }
    public string Source { get; set; }
    public int EventID { get; set; }
    public string Category { get; set; }
    public string Message { get; set; }
    public string MachineName { get; set; }
    public string UserName { get; set; }
}

XMLフィルター

今回はXMLファイルの中身のフィルターを参照して、取得するログを減らしていきます。

    //こんな形にログをふるい落としていきます。
    var DelXML = sources.Where(x => !Checkcol(xDoc, "EventID").Contains(x.EventID.ToString()))
                        .Where(x => !Checkcol(xDoc, "Level").Contains(x.Level))
                        .Where(x => !Checkcol(xDoc, "Source").Contains(x.Source))
                        .Where(x => !Checkcol(xDoc, "Category").Contains(x.Category))
                        .Where(x => !Checkcol(xDoc, "TimeWritten").Contains(x.TimeWritten.ToString()));
    //  => !は除外する
    
//{aaa,bbb,ccc,ddd}の形に編成する
private string Checkcol(XDocument xDoc ,string ColName)
{
    var objreturn = "";
    var element = (from o in xDoc.Element("Fillter").Elements(ColName) select o); 
    foreach (var objex in element)
    {
        objreturn += objex.Value;
    }
    return objreturn;
}

DelXMLで取得したものをDatagridviewに渡して表として表示しております。

家庭用のパソコンと会社のパソコンですと動作時間とログ数が違うので、家庭用ですと6千件を2秒くらいで取得してくれます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です