2014-10-07 5 views
0

Редактировать: ok Я знаю, что запрос неверен. Когда я удаляю TimeCreated часть, я возвращаю результаты. Каков правильный способ вывести все события за этот день?EventLogQuery не вытягивает результаты

startTime = DateTime.Now.Date 

string query = "*[System/Level=1 or System/Level=2] and TimeCreated[@SystemTime >= '" + startTime + "']"; 
using (EventLogSession session = new EventLogSession(serverName)) 
{ 
    EventLogQuery eventQuery = new EventLogQuery(logName, PathType.LogName, query); 
    eventQuery.Session = session; 

    using (EventLogReader reader = new EventLogReader(eventQuery)) 
    { 
     for (EventRecord eventDetail = reader.ReadEvent(); eventDetail != null; eventDetail = reader.ReadEvent()) 
     { 
      entries.Add(eventDetail); 
     } 
    } 
} 

Я устал следующее, а

"*[System/Level=1 or System/Level=2] and *[System/TimeCreated[@SystemTime >= '" + startTime + "']]"; 

"*[System[(Level=1) or System[(Level=2)] and TimeCreated[@SystemTime >= '" + startTime.ToUniversalTime().ToString("o") + "']]"; 
+0

Вы можете проверить свой запрос непосредственно в диалоговом окне просмотра событий Windows. Вы можете параметризовать его, а затем получить соответствующий запрос. Я отправлю помощника, который я сделал для одного из моих проектов. – FloChanz

ответ

1

Здесь я сделал помощник для получения журнала от просмотра событий, вы можете параметризованное это довольно легко

public static void WriteEventViewerHistoryByTypes(IList<EventViewerCriticalityLevel> levelTypes, string logType, string filePath, IList<string> sources, DateTime? startDate = new System.Nullable<DateTime>(), DateTime? endDate = new System.Nullable<DateTime>()) 
    { 
     if (levelTypes == null || levelTypes.Count == 0) 
      levelTypes = new List<EventViewerCriticalityLevel> { EventViewerCriticalityLevel.Comment, EventViewerCriticalityLevel.Error, EventViewerCriticalityLevel.Fatal, EventViewerCriticalityLevel.Info, EventViewerCriticalityLevel.Warning }; 

     StringBuilder sb = new StringBuilder(); 
     sb.Append("<QueryList>"); 
     sb.AppendFormat("<Query Id=\"0\" Path=\"{0}\">", logType); 
     sb.AppendFormat(" <Select Path=\"{0}\">", logType); 
     sb.AppendFormat(" *[System[("); 

     sb.AppendFormat("({0})", string.Join(" or ", levelTypes.Select(lev => 
      { 

       if (lev == EventViewerCriticalityLevel.Info) 
        return string.Format("Level={0} or Level=0", (int)lev); 
       else 
        return string.Format("Level={0}", (int)lev); 
      }))); 

     if (sources != null && sources.Count > 0) 
     { 
      sb.AppendFormat(" or "); 
      sb.AppendFormat("(Provider[{0}])", string.Join(" or ", sources.Select(el => "@Name='" + el + "'"))); 
     } 
     sb.AppendFormat(")"); 
     if (startDate.HasValue) 
     { 
      sb.AppendFormat(" and TimeCreated[@SystemTime >= '{0}']", startDate.Value.ToString("o")); 
     } 
     if (endDate.HasValue) 
     { 
      sb.AppendFormat(" and TimeCreated[@SystemTime <= '{0}']", endDate.Value.ToString("o")); 
     } 
     sb.AppendFormat("]]"); 
     sb.AppendFormat(" </Select>"); 
     sb.AppendFormat("</Query>"); 
     sb.Append("</QueryList>"); 

     try 
     { 
      EventLogSession sess = new EventLogSession(); 
      sess.ExportLogAndMessages(logType, PathType.LogName, sb.ToString(), filePath, true, CultureInfo.CurrentCulture); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

и здесь перечисление

public enum EventViewerCriticalityLevel 
{ 
    Fatal = 1, 
    Error = 2, 
    Warning = 3, 
    Info = 4, 
    Comment = 5 
} 

Он будет генерировать файлы evtx, которые вы можете прочитать с помощью консоли просмотра событий.

Надеюсь, это поможет!

Смежные вопросы