2009-05-27 23 views
12

Estoy trabajando en una aplicación que lee eventlogs (Aplicación) desde máquinas remotas. Estoy haciendo uso de la clase EventLog en .net y luego iterando en las entradas de Log, pero esto es muy lento. En algunos casos, algunas máquinas tienen más de 400 entradas de registro y se tardan horas en recorrer las entradas. ¿Cuál es la mejor manera de lograr esta tarea? ¿Hay otras clases en .net que sean más rápidas o en cualquier otra tecnología?¿Cuál es la forma más rápida de leer el registro de eventos en la máquina remota?

+0

No sé cuál es la mejor manera de leer los elementos del registro de eventos, pero le aconsejo que reconsidere su arquitectura. ¡Deberías usar alguna otra tecnología de registro! Usaría el bloque de la aplicación de registro de la biblioteca empresarial. Luego puede iniciar sesión fácilmente en una base de datos (también puede iniciar sesión en el registro de eventos). A continuación, puede ejecutar fácilmente una consulta en el DB. –

+0

No estoy iniciando sesión en el registro de eventos. Hay varias aplicaciones que se registran en el registro de eventos y Mi aplicación busca en el registro de eventos en función de la fuente y el código del evento para obtener la información. – Kapil

Respuesta

-1

Tal vez que los equipos remotos podrían hacer un poco de la informática. De esta forma, su servidor solo trataría con información relevante. Sería un tipo de clúster que utiliza la computadora remota para hacer un poco de filtrado de luz y el servidor sería la parte del análisis.

0

¿Ha intentado utilizar las funciones remotas en powershell 2.0? Permiten ejecutar cmdlets (como los que se usan para leer registros de eventos) en máquinas remotas y devolver los resultados (como objetos, por supuesto) a la sesión de llamada.

0

Puede colocar un programa en aquellas máquinas que guardan el registro en un archivo y lo envía a su aplicación de Internet, creo que sería mucho más rápido, ya que puede hacer el bucle local pero no estoy seguro de cómo hacerlo, así que no puedo que cualquier código :(

15

hombre, siento su dolor. Nos tenía el mismo problema exacto en nuestra aplicación.

su solución tiene una rama dependiendo de qué versión del servidor se está ejecutando en el servidor y qué versión de su la máquina "objetivo" se está ejecutando.

Si ambos están en Vista o Windows Server 2008, estás de suerte. Deberías verte en System.Diagnostics.Eventing.Reader.EventLogQuery y System.Diagnostics.Eventing.Reader.EventLogReader. Estos son nuevos en .net 3.5.

Básicamente, puede crear una consulta en XML y enviarla a ejecutar en la computadora remota. Tal vez solo estás buscando eventos de un tipo específico, o tal vez solo eventos nuevos de un momento específico. La búsqueda se ejecuta en la máquina remota y luego recuperas los eventos coincidentes. Las nuevas clases son mucho más rápidas que la anterior .NET 2.0, pero de nuevo, solo son compatibles con Vista o Windows Server 2008.

Para nuestra aplicación cuando el objetivo NO está en Vista/Win2008, descargamos la versión en bruto. evt desde el sistema remoto, y luego analizó el archivo usando su formato binario. Hay varias fuentes de datos sobre el formato del registro de eventos para archivos .evt (previos a la Vista), incluido el link text y un artículo que recuerdo en codeproject.com que tenía algún código C#.

Las máquinas Vista y Windows Server 2008 usan un nuevo formato .evtx que es un formato nuevo, por lo que no puede usar el mismo enfoque de análisis binario en todas las versiones. Pero las nuevas clases EventLogQuery y EventLogReader son tan rápidas que no será necesario. Ahora es perfectamente rápido usar las clases integradas.

2

Event Log Reader es terriblemente lento ... demasiado lento. WTF Microsoft?

Use LogParser 2.2 - Busque C# y LogParser en Internet (o puede usar los comandos del analizador de registros desde la línea de comandos). No quiero duplicar el trabajo ya contribuido por otros.

Extraigo el registro del sistema remoto haciendo que el registro se exporte como un archivo EVTX. Luego copio el archivo del sistema remoto.Este proceso es realmente rápido, incluso con una red que abarca todo el planeta (tuve problemas para exportar el registro a un recurso de red). Una vez que lo tiene local, puede hacer sus búsquedas y procesamiento.

Existen varias razones para tener el EVTX: no entraré en las razones por las que hacemos esto.

El siguiente es un ejemplo de trabajo del código para guardar una copia del registro como EVTX: (Notas: "dispositivo" es el nombre de host de la red o IP. "LogName" es el nombre del registro deseado: "Sistema", "Seguridad" o "Aplicación". OutputPathOnRemoteSystem es la ruta en la computadora remota, como "c: \ temp \% hostname%.% LogName%.% YYYYMMDD_HH.MM% .evtx".)

static public bool DumpLog(string device, string LogName, string outputPathOnRemoteSystem, out string errMessage) 
    { 
     bool wasExported = false; 
     string errorMessage = ""; 
     try 
     { 
      System.Diagnostics.Eventing.Reader.EventLogSession els = new System.Diagnostics.Eventing.Reader.EventLogSession(device); 
      els.ExportLogAndMessages(LogName, PathType.LogName, "*", outputPathOnRemoteSystem); 
      wasExported = true; 

     } 
     catch (UnauthorizedAccessException e) 
     { 
      errorMessage = "Unauthorized - Access Denied: " + e.Message; 
     } 
     catch (EventLogNotFoundException e) 
     { 
      errorMessage = "Event Log Not Found: " + e.Message; 
     } 
     catch (EventLogException e) 
     { 
      errorMessage = "Export Failed: " + e.Message + ", Log: " + LogName + ", Device: " + device; 
     } 
     errMessage = errorMessage; 
     return wasExported; 
    } 
2

Una buena Explicación/Ejemplo se puede encontrar en MSDN.

EventLogSession session = new EventLogSession(Environment.MachineName); 

// [System/Level=2] filters out the errors 
// Where "Log" is the log you want to get data from. 
EventLogQuery query = new EventLogQuery("Log", PathType.LogName, "*[System/Level=2]"); 

EventLogReader reader = new EventLogReader(query); 

for (EventRecord eventInstance = reader.ReadEvent(); 
    null != eventInstance; 
    eventInstance = reader.ReadEvent()) 
{ 
    // Output or save your event data here. 
} 

Al esperar 5-20 minutos con el código anterior, éste lo hace en menos de 10 segundos.

Cuestiones relacionadas