2011-12-19 9 views
5

Sto provando a utilizzare la classe EventLogQuery per interrogare il registro eventi. Ho seguito l'esempio mostrato su http://msdn.microsoft.com/en-us/library/bb671200%28v=vs.90%29.aspx#Y0.Formato previsto per EventLogQuery?

Ho cercato Google un sacco ma non riesco a trovare alcuna query con il @SystemTime non codificato.

Qualcuno conosce il formato DateTime che devo usare per questo? Tutto ciò che ho provato fino ad ora ha restituito eccezioni "Query non valide".

risposta

12

EventLogQuery utilizza un formato XML per interrogare il registro eventi. È possibile trovare lo schema per la query XML here.

Il testo di Select element è un'espressione XPath valutata rispetto alla serializzazione XML degli eventi.

È possibile trovare lo schema per l'evento XML here.

Il TimeCreated element ha un attributo di tipo SystemTime dateTime, in modo che il formato di questo (in XML query) è tutto ciò che un processore XPath in grado di analizzare come DateTime valido (vedi 3.2.7.1. Lexical representation per le specifiche).

Per esempio si può provare una query come questa:

<QueryList> 
    <Query Id="0" Path="Application"> 
    <Select Path="Application">*[System[TimeCreated[@SystemTime = '2011-12-20T00:42:53.000000000Z']]]</Select> 
    </Query> 
</QueryList> 

Quali analizza e restituisce un valore, se vi capita di avere un evento creato esattamente alla data e l'ora dato.

anche dateDiff è una funzione estensione del protocollo filtro XPath, che richiede uno o due argomenti di SYSTEMTIME tipo e restituisce un numero, quindi basta usare un numero in un'espressione con questa funzione (proprio come nel tuo esempio).


P.S. È possibile utilizzare il Visualizzatore eventi di Windows (%windir%\system32\eventvwr.msc) per entrare e valutare rapidamente query di eventi XML creating Custom Views (Windows Vista, 7 e nel 2008 solo):

enter image description here

+0

Grazie mille. La tua risposta è stata un vero toccasana. – user1106686

+0

Contento di aver potuto aiutare. Si prega di contrassegnare come risposta. –

+3

grazie fantastico post. Vorrei solo aggiungere che il formato data ora accettato qui è dtObj.ToString ("O").dtObj è l'oggetto datetime di partenza. – sunder

0

Event XML

C'è un esempio qui di XML con una versione di stringa del formato della data prevista.

<TimeCreated SystemTime="2006-02-28T21:51:44.754Z" /> 
+0

Apprezzo l'aiuto. Tuttavia, potresti darmi un esempio di come sarebbe la stringa di formato per questo? – user1106686

+0

@ user1106686 Ho modificato la mia risposta per includere la riga dell'esempio con una stringa datetime. Spero che questo ti aiuti. – Bueller

1

Ecco un esempio in C# per inizializzare un oggetto EventLogQuery che verrà carica solo le voci dell'evento dall'ultimo giorno.

var yesterday = DateTime.UtcNow.AddDays(-1); 

var yesterdayDtFormatStr = yesterday.ToString(
    "yyyy-MM-ddTHH:mm:ss.fffffff00K", 
    CultureInfo.InvariantCulture 
); 

var query = string.Format(
    "*[System/TimeCreated/@SystemTime >='{0}']", 
    yesterdayDtFormatStr 
); 

var elq = new EventLogQuery("Application", PathType.LogName, query); 
1

Ecco un altro C# per inizializzare un oggetto EventLogQuery che caricherà interi eventi per un intervallo di date

var startTime = DateTime.Now.AddDays(-1); 
var endTime = DateTime.Now; 

var query = string.Format("*[System[TimeCreated[@SystemTime >= '{0}']]] and *[System[TimeCreated[@SystemTime <= '{1}']]]", 
    startTime.ToUniversalTime().ToString("o"), 
    endDate.ToUniversalTime().ToString("o")); 

var elq = new EventLogQuery("Applicaton", PathType.LogName, query);