.net-4.5 event-log etw

ETW,.NET 4.5-¿Cómo escribir en el registro de eventos?



.net-4.5 event-log (6)

Estoy tratando de envolver mi cabeza en torno a ETW y cómo integrar t en una aplicación de alto rendimiento.

Todos conocemos el antiguo EventLog temido con su API no estructurada (y por lo tanto no tan óptima).

Ahora hay una API nueva y elegante para el seguimiento de alto rendimiento - ETW, y obtuvo una nueva API en el lado .NET en 4.5 en la forma de la clase EventSource que puede subclasificar fácilmente (por lo que no hay más escritura manifiesta).

Esto me deja con una serie de preguntas, tratando de hacer que esto funcione.

  • ¿Cuál es la mejor forma actual propuesta (según la documentación, las Directrices) para trabajar con ETW y obtener eventos desde allí en EventLog? Tengo una aplicación aquí que debe escribir eventos (de rendimiento) y me encantaría usar ETW; pero los eventos aparecerán en un registro de eventos (personalizado).
  • ¿Hay un ejemplo completo para esto? Puedo encontrar algunos, pero todos se remontan a la hora de .NET 4.0 y comienzan con el manifiesto.

¿Qué intenté? Conseguí que un EventSource funcionara, pero simplemente no he podido obtener la documentación adecuada sobre cómo hacer que el resto funcione en sentido descendente desde allí.



En agosto de 2013, Microsoft.Diagnostics.Tracing.EventSource 1.0.4 beta se lanzó en NuGet. Las tres grandes ganancias son el soporte de canales, el soporte de manifiesto estático (instalado) (las dos cosas necesarias para acceder al Visor de eventos) y el soporte de .NET 4.0.

De acuerdo con la publicación del blog que anuncia RTM, Microsoft.Diagnostics.Tracing.EventSource "permite el rastreo rápido de aplicaciones en el registro de eventos de Windows, incluso en producción".


Esto es muy interesante, ya que he estado trabajando en los requisitos similares hasta tarde. En primer lugar, puede generar un manifiesto a partir de la clase EventSource utilizando su método estático GenerateManifest (typeof (MyEvents), null). Esto le proporcionará el manifiesto de sus eventos, etc., pero no contiene detalles sobre los canales. Deberá definir los canales usted mismo en el manifiesto y luego registrarse está usando las utilidades wevtutil.exe, mc.exe y rc.exe. Esto le creará los registros de eventos según el nombre de su proveedor en el manifiesto.

Curiosamente, pude obtener los registros de depuración y análisis para mostrarme los eventos generados a través de EventSource. También podría usar la sesión de rastreo de Perfmon para registrar los eventos durante cierto período con filtros en palabras clave y niveles. El proveedor también aparece en la lista de proveedores de Trace Session.

Lo único que estoy mirando en este momento es traer los eventos en los canales de Admim y Operation. Por favor, grite si necesita muestras, etc.

Los detalles están presentes en: http://www.suneet.net/FrmBlogViewer.aspx?blogid=75



Lo que está tratando de lograr no es posible debido a lo siguiente;

  • Para dirigir los eventos de ETW al registro de eventos, deberá especificar un canal de tipo Admin, Operational o algún clásico como Application en el manifiesto y registrarlo con wevtutil. Desafortunadamente, no puede usar EventSource para esto, incluso si tenía un manifiesto, ya que la implementación subyacente no establece el byte del canal en el bloque EventDescriptor al llamar a WriteEvent, por ejemplo, su evento nunca se marca para un canal específico.

  • Lo que EventSource hace detrás de la escena para evitar el engorroso proceso de registro del manifiesto, compilarlo en el recurso win32, vincularlo a un ensamblado / dll, registrarlo, etc. es generar un manifiesto desde su implementación EventSource y enviarlo como un evento conocido a permita que el servicio receptor analice todas las demás cargas útiles de eventos en lugar de confiar en la infraestructura de Windows para obtener la información del manifiesto. Hasta donde sé, solo PerfView soporta esto por ahora.