2014-12-30 8 views
0

응용 프로그램 이벤트 로그를 주기적으로 폴링하여 새 항목을 확인하고 처리 한 후 나중에 .evtx 파일로 구문 분석하는 작업이 있습니다.EventLogQuery가 새 이벤트 로그 레코드를 반환하지 않습니다.

이 작업은 문제가되지 않습니다. 는 그 같은 코드를 사용하고 있습니다 :

using (var els = new EventLogSession()) 
{ 
    string timeString = timestamp.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); 
    string queryString = String.Format(
     "<QueryList> <Query Id='0' Path='{0}'> <Select Path='{0}'> " + 
     "*[System[TimeCreated[@SystemTime&gt;'{1}']]]</Select> </Query> </QueryList>", 
     logName, timeString); 
    var query = new EventLogQuery(logName, PathType.LogName, queryString) { Session = els }; 
    var records = new List<EventRecord>(); 
    using (var logReader = new EventLogReader(query)) 
    { 
     EventRecord record; 
     while ((record = logReader.ReadEvent()) != null) 
     { 
       //log entries processed here 
       ... 
       //finally export log messages to a file 
       els.ExportLogAndMessages(logName, PathType.LogName, queryString, fileName, true, CultureInfo.GetCultureInfo("en")); 
     } 
    } 
} 

는 불행하게도 내 PC를 다시 시작하고 응용 프로그램을 시작한 후 것을 발견 - EventLogReader 항상 동일한 데이터 집합을 반환, 내 응용 프로그램을 다시 시작하더라도. 즉, 새로운 메시지는 logReader.ReadEvent() 메서드에서 얻은 결과에 나타나지 않습니다.

그러나 쿼리 문자열을 간단한 별표로 변경하고이를 EventLogQuery로 전달하면이 상황이 해결되고 logReader는 새 메시지를 포함하여 모든 메시지를 반환합니다. 지금은 "*"쿼리 문자열을 사용하고 코드로 오래된 항목을 필터링하지만 이것이 나에게 가장 좋은 해결책은 아닙니다.

내 검색어에 실수가 있습니까? EventLogSession 또는 EventLogReader 객체를 처리하는 데 실수가 있습니까? 알려진 MS 버그입니까?

답변

1

저는 이것이 오래된 질문이지만, 답변이 없으며 최근에이 분야에서 일해오고 있습니다. 이 코드

가능한 문제 : 날짜에 대한

사용 UTC 시간, 그리고 대신

.ToString("o") 

.ToString("yyyy-MM-ddTHH:mm:ss.fffZ") 

쿼리에서 외부 XML 중 하나를 포함하지 마십시오 끈. 쿼리 비트 만 있으면됩니다. 따라서 다음과 같아야합니다.

날짜 필터링을위한 복잡한 쿼리 식을 만드는 대신 EventBookmark를 사용하는 것이 좋습니다. EventBookmarks 그 목적을 위해 설계되었습니다. 비슷한 목적으로 EventBookmark를 사용하는 예제는 How to create an EventBookmark when querying the event log을 참조하십시오. 당신이 EventBookmark이 있으면

당신은 단순히 사용

using (var logReader = new EventLogReader(query, EventBookmark)) 

당신의 독자가 이전 북마크 후 엔트리에서 시작되도록 할 수 있습니다.