utilizar tutorial tag studio programacion móviles manager libros google desarrollo curso como aplicaciones .net enterprise-library event-log

.net - tutorial - manual de programacion android pdf



¿Cómo creo una jerarquía de nombres de registro en el sistema de eventos de Windows? (2)

  • Estoy registrando mensajes usando Enterprise Library.
  • Quiero que algunos de estos (generalmente errores y advertencias) se pasen al sistema de eventos de Windows). Hoy enruté estos a través de entlib.config.

Esta solución funciona y hasta ahora, todo bien. Pero tengo más necesidades de las que me brinda esta solución. Tengo varias instalaciones que deberían registrar registros diferentes, pero quiero que sus nombres sean lógicos e intuitivos en el visor de eventos. Pero, el sistema de eventos de Windows no puede tener dos categorías donde los primeros 8 caracteres en el nombre son los mismos. El nombre de la categoría puede ser más largo, pero solo se usan las primeras 8 letras para distinguirlas. .Net en realidad emite una advertencia si esto sucede:

Solo los primeros ocho caracteres de un nombre de registro personalizado son significativos, y ya hay otro registro en el sistema que utiliza los primeros ocho caracteres del nombre dado.

Actualmente tengo que recurrir a los prefijos crípticos, pero todavía estoy en peligro de tener múltiples instalaciones "colisionando" entre sí en el registro de nombres, por lo que necesito una mejor solución.

Sin embargo, en el visor de eventos en mi computadora puedo ver que también hay jerarquías de nombres de registro, que es exactamente lo que necesito. Tanto Microsoft como Cisco obviamente han encontrado una manera de hacer esto:

Pero, ¿cómo puedo crear una jerarquía de este tipo para el registro, donde cada aplicación puede instalarse varias veces? Me gusta esto:

CompanyName ApplicationName Installation1 Installation2


.NET 4 respuesta

Lo que parece que están viendo son los canales de Event Tracing para Windows (ETW). Puede ver los elementos relevantes en el registro en HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/WINEVT .

Para usar esas funciones, tendría que usar la nueva funcionalidad de registro de eventos de Windows que reemplaza a la API de registro de eventos a partir de Vista y parece que está principalmente orientada al desarrollo de C / C ++. Parece que algo de esto está expuesto a través del Sistema.Diagnostics.Eventing Namespace .

Encontré una buena descripción general de ETW para mejorar la depuración y la optimización del rendimiento con ETW .

La buena noticia es que parece que puedes hacer lo que quieras. Deberá crear un manifiesto XML que contenga información del proveedor, así como los eventos que se registrarán. Luego debe usar el Compilador de mensajes (MC.EXE!) En el manifiesto para crear encabezados, archivos de recursos y clases de registro y luego registrar el proveedor.

Si descarga Microsoft Windows SDK para Windows 7 y .NET Framework 4 , encontrará en el Samples/winbase/Eventing/Provider/Simple/CSharp una solución de ejemplo de .NET que lo guiará por todos los pasos.

Si bien cumple con sus requisitos jerárquicos y es bastante bueno, para una línea típica de aplicación comercial, esto podría ser un poco excesivo en términos de complejidad. Además, el código generado por el compilador de mensajes es un código no seguro, por lo que también puede ser negativo.

.NET 4.5 Respuesta

En .NET 4.5 hay mucho mejor soporte para ETW usando la clase EventSource. Consulte el registro de alta velocidad de Windows: ETW en C # / .NET usando System.Diagnostics.Tracing.EventSource para una introducción. También hay ahora soporte de registro de eventos con EventSource. Consulte Cómo anunciar el paquete EventSource NuGet: escriba en el registro de eventos de Windows para obtener una guía. Básicamente, en el momento de la compilación, se genera un manifiesto y un DLL de manifiesto para cada EventSource y estos se pueden registrar usando wevtutil.exe. Con la adición de EventSource y el soporte del canal de registro de eventos, este enfoque ahora parece ser sencillo y viable.

Finalmente, tenga en cuenta para aquellos interesados ​​en ETW que el equipo de patrones y prácticas tiene un bloque de aplicaciones Bloqueo semántico de aplicaciones que puede usar ETW.


Los proveedores deben tener un nombre que tenga el formato "Compañía-Producto-Componente". Para que quede claro, el nombre de un proveedor debe incluir 2 ''-'' símbolos. La documentación sobre esto se puede encontrar here .

Los canales también deben tener sus nombres escritos de una manera específica. Una vez más, la documentación de MSDN explica esto. Debe asignar un nombre a su canal con el formato "Compañía-Producto-Componente / tipo".

Aquí hay un fragmento de un manifiesto que escribí para que lo uses como ejemplo:

<provider name="Our Company-OurApp-Service" guid="{4990f5dc-85a0-4660-9ce0-275e027a02d2}" symbol="GUID_PROVIDER" resourceFileName="C:/Program Files (x86)/Our Company/OurApp/service.exe" messageFileName="C:/Program Files (x86)/Our Company/OurApp/service.exe" parameterFileName="C:/Program Files (x86)/Our Company/OurApp/service.exe" message="$(string.Provider.Name)"> <channels> <channel chid="c1" name="Our Company-OurApp-Service/Operational" type="Operational" symbol="CHANNEL_1" isolation="Application" enabled="true"/> </channels> ...

La jerarquía de carpetas que vemos en el visor de eventos es una ilusión. En realidad, es solo una lista plana de proveedores y canales representados como una estructura rígida de 3 carpetas. Esta es la razón por la que varias carpetas en Microsoft/Windows tienen guiones en sus nombres en lugar de anidar más.