2011-12-19 7 views
5

Estoy tratando de usar la clase EventLogQuery para consultar el registro de eventos. Seguí el ejemplo que se muestra en http://msdn.microsoft.com/en-us/library/bb671200%28v=vs.90%29.aspx#Y0.Se espera el formato de hora EventLogQuery?

He buscado en Google un montón, pero no puedo encontrar ninguna consulta con el @SystemTime no codificado allí.

¿Alguien sabe el formato DateTime que necesito usar para esto? Todo lo que he intentado hasta ahora ha devuelto las excepciones de "Consulta no válida".

Respuesta

12

EventLogQuery utiliza un formato XML para consultar el registro de eventos. Puede encontrar el esquema para la consulta XML here.

El texto del Select element es una expresión XPath evaluada frente a la serialización XML de eventos.

Puede encontrar el esquema para el evento XML here.

El TimeCreated element tiene un atributo de tipo SYSTEMTIME dateTime, por lo que el formato de este (en su consulta XML) es lo que un procesador XPath puede analizar como una fecha y hora válida (ver 3.2.7.1. Lexical representation para los detalles).

Por ejemplo, usted puede probar una consulta como esta:

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

que analiza y devuelve un valor si le sucede que tiene un evento creado exactamente en la fecha y hora determinada.

También dateDiff es una función de extensión del protocolo Filter XPath, que toma uno o dos argumentos del tipo SYSTEMTIME y devuelve un número, así que simplemente use un número en expresión con esta función (como en su ejemplo).


P.S. Puede utilizar el Visor de sucesos de Windows (%windir%\system32\eventvwr.msc) para entrar y evaluar rápidamente XML evento de consulta por creating Custom Views (Windows Vista, 7 y 2008 solamente):

enter image description here

+0

Muchas gracias. Su respuesta fue un salvavidas. – user1106686

+0

Me alegro de poder ayudar. Por favor marque como respuesta. –

+3

gracias gran publicación. Me gustaría agregar aquí que el formato de fecha y hora aceptado aquí es dtObj.ToString ("O").dtObj es tu objeto datetime inicial. – sunder

0

Event XML

Hay aquí un ejemplo del XML con una cadena de versión del formato de la fecha esperada.

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

aprecio la ayuda. Sin embargo, ¿podría darme un ejemplo de cómo se vería la cadena de formato para esto? – user1106686

+0

@ user1106686 He editado mi respuesta para incluir la línea del ejemplo con una fecha de cadena. Espero que esto ayude. – Bueller

1

Aquí está un ejemplo de C# para inicializar un objeto EventLogQuery que se solo cargar entradas de eventos desde el último día.

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

Aquí es otra C# para inicializar un objeto EventLogQuery que cargará entires de eventos para un intervalo de fechas específico

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); 
Cuestiones relacionadas