What is the event log class?

Creando Fuentes de Eventos: Guía Paso a Paso

hace 10 años

★★★★★Valoración: 4.05 (2813 votos)

En el mundo del desarrollo de software, el registro de eventos juega un papel fundamental para el monitoreo, la depuración y el mantenimiento de aplicaciones. Una fuente de eventos actúa como el origen identificable de los mensajes de eventos dentro del sistema operativo Windows. Este artículo te guiará a través del proceso de creación de fuentes de eventos personalizadas, permitiéndote registrar información relevante de tus aplicaciones de manera organizada y eficiente.

Índice de Contenido

¿Qué es una Fuente de Eventos?

Una fuente de eventos es, esencialmente, un nombre registrado en el sistema Windows que identifica a una aplicación o componente como el emisor de eventos. Cuando una aplicación escribe un evento en el registro de eventos de Windows, debe especificar una fuente. El sistema operativo utiliza esta fuente para determinar a qué registro de eventos se debe dirigir la entrada. Piensa en la fuente de eventos como la firma de tu aplicación dentro del registro de eventos; permite a los administradores y al sistema identificar rápidamente el origen de un evento.

What is an event log source?
The event source indicates what logs the event. It is often the name of the application, or the name of a subcomponent of the application, if the application is large. Applications and services should write to the Application log or a custom log. Device drivers should write to the System log.

Es importante destacar que una fuente de eventos no es lo mismo que un registro de eventos. Un registro de eventos es el archivo donde se almacenan los eventos (por ejemplo, Registro de Aplicaciones, Registro de Sistema). Una fuente de eventos, por otro lado, es simplemente un nombre que se asocia con una aplicación y se utiliza para escribir eventos en uno de estos registros.

Creando una Fuente de Eventos con .NET

En el entorno .NET, la clase EventLog proporciona las herramientas necesarias para interactuar con los registros de eventos de Windows, incluyendo la creación de fuentes de eventos. El método estático clave para esto es CreateEventSource. Existen dos sobrecargas principales de este método, pero la más completa y recomendada utiliza la clase EventSourceCreationData.

Usando EventSourceCreationData

La clase EventSourceCreationData permite configurar diversas propiedades para la nueva fuente de eventos y su registro de eventos asociado. Esto incluye el nombre de la fuente, el nombre del registro de eventos (si deseas usar uno personalizado), y la configuración para mensajes de eventos localizados.

La sintaxis para usar CreateEventSource con EventSourceCreationData en C# es la siguiente:

public static void CreateEventSource(System.Diagnostics.EventSourceCreationData sourceData); 

El parámetro sourceData es un objeto de tipo EventSourceCreationData que contiene las propiedades de configuración. Veamos las propiedades más importantes que puedes configurar en EventSourceCreationData:

  • Source (Fuente): El nombre de la fuente de eventos que se registrará. Este es el nombre que usarás en tu código para escribir eventos.
  • LogName (Nombre del Registro): El nombre del registro de eventos donde se escribirán los eventos. Si no se especifica, se utilizará el registro de "Aplicación" por defecto. Puedes crear registros de eventos personalizados.
  • MachineName (Nombre del Equipo): El nombre del equipo donde se creará la fuente de eventos. Por defecto, es el equipo local ("."). Puedes crear fuentes de eventos en equipos remotos, pero requiere permisos administrativos.
  • MessageResourceFile (Archivo de Recursos de Mensajes): La ruta al archivo de recursos (DLL) que contiene las cadenas de mensajes de eventos localizadas.
  • CategoryResourceFile (Archivo de Recursos de Categorías): La ruta al archivo de recursos (DLL) que contiene las cadenas de categorías de eventos localizadas.
  • ParameterResourceFile (Archivo de Recursos de Parámetros): La ruta al archivo de recursos (DLL) que contiene las cadenas de parámetros de eventos localizadas.
  • CategoryCount (Conteo de Categorías): El número de categorías definidas en el archivo de recursos de categorías.

Ejemplo Práctico en C#

El siguiente ejemplo en C# muestra cómo crear una fuente de eventos llamada "SampleApplicationSource" para un registro de eventos personalizado llamado "myNewLog". También configura un archivo de recursos de mensajes para la fuente.

How to create an event source?
You can configure a new source using an EventLogInstaller, or using the CreateEventSource method. You must have administrative rights on the computer to create a new event source. You can create an event source for an existing event log or a new event log.
using System; using System.Diagnostics; using System.IO; public class EventSourceExample { public static void Main(string[] args) { string sourceName = "SampleApplicationSource"; string logName = "myNewLog"; string messageFile = "EventLogMsgs.dll"; // Reemplaza con la ruta real a tu archivo DLL de recursos int categoryCount = 3; // Reemplaza con el número real de categorías en tu archivo de recursos if (!EventLog.SourceExists(sourceName)) { EventSourceCreationData sourceData = new EventSourceCreationData(sourceName, logName); if (!File.Exists(messageFile)) { Console.WriteLine($"El archivo de recursos de mensajes no existe: {messageFile}"); messageFile = ""; } else { sourceData.MessageResourceFile = messageFile; sourceData.CategoryResourceFile = messageFile; sourceData.ParameterResourceFile = messageFile; sourceData.CategoryCount = categoryCount; Console.WriteLine($"Archivo de recursos de mensajes establecido: {messageFile}"); } Console.WriteLine("Registrando nueva fuente para el registro de eventos."); EventLog.CreateEventSource(sourceData); Console.WriteLine("Fuente de eventos creada."); } else { Console.WriteLine($"La fuente de eventos '{sourceName}' ya existe."); } } } 

Puntos importantes del ejemplo:

  • Se verifica si la fuente de eventos ya existe usando EventLog.SourceExists(sourceName).
  • Se crea un objeto EventSourceCreationData con el nombre de la fuente y el nombre del registro.
  • Se verifica la existencia del archivo de recursos de mensajes.
  • Se configuran las propiedades MessageResourceFile, CategoryResourceFile, ParameterResourceFile y CategoryCount en EventSourceCreationData.
  • Se llama a EventLog.CreateEventSource(sourceData) para crear la fuente de eventos.

Excepciones al Crear Fuentes de Eventos

El método CreateEventSource puede lanzar varias excepciones si algo sale mal durante el proceso de creación. Es importante manejar estas excepciones para asegurar la robustez de tu aplicación. Algunas de las excepciones más comunes son:

  • ArgumentException: Se lanza en varias situaciones, incluyendo:
    • El nombre del equipo especificado en sourceData no es válido.
    • El nombre de la fuente especificado en sourceData es nulo.
    • El nombre del registro especificado en sourceData no es válido (caracteres inválidos, nombres reservados como AppEvent, SysEvent, SecEvent, o si coincide con un nombre de fuente existente).
    • El nombre de la fuente resulta en una ruta de clave de registro demasiado larga (más de 254 caracteres).
    • Los primeros 8 caracteres del nombre del registro no son únicos.
    • El nombre de la fuente ya está registrado.
    • El nombre de la fuente coincide con un nombre de registro de eventos existente.
  • InvalidOperationException: Se lanza si no se puede abrir la clave de registro para el registro de eventos. Esto suele indicar problemas de permisos.
  • ArgumentNullException: Se lanza si sourceData es nulo.

Importancia de la Creación Temprana de Fuentes de Eventos

Es una buena práctica crear la fuente de eventos durante el proceso de instalación de tu aplicación, en lugar de crearla justo antes de escribir el primer evento. Esto permite que el sistema operativo actualice su lista de fuentes de eventos registradas y su configuración. Si intentas escribir un evento con una fuente recién creada inmediatamente después de su creación, la operación podría fallar porque el sistema operativo aún no ha refrescado su información.

Utilizar un instalador (como EventLogInstaller en .NET) o llamar a CreateEventSource durante la instalación asegura que la fuente esté correctamente configurada y disponible cuando tu aplicación comience a ejecutarse y a registrar eventos.

Escribiendo Eventos al Registro

Una vez que tienes una fuente de eventos creada, puedes usar los métodos WriteEvent y WriteEntry de la clase EventLog para escribir eventos al registro asociado. WriteEvent es más adecuado para eventos localizados usando identificadores de recursos, mientras que WriteEntry es más sencillo para escribir mensajes de texto directamente.

Fuentes de Eventos Localizadas

Para aplicaciones que necesitan soporte para múltiples idiomas, las fuentes de eventos localizadas son esenciales. En lugar de escribir cadenas de texto directamente en el registro de eventos, puedes registrar tu fuente de eventos con archivos de recursos localizados. Estos archivos contienen las cadenas de texto para diferentes idiomas, y el Visor de Eventos de Windows mostrará el mensaje en el idioma apropiado según la configuración del sistema del usuario.

How do I write to EventLog?
The Write-EventLog cmdlet writes an event to an event log. To write an event to an event log, the event log must exist on the computer and the source must be registered for the event log. The cmdlets that contain the EventLog noun (the EventLog cmdlets) work only on classic event logs.

Como se mostró en el ejemplo de código, las propiedades MessageResourceFile, CategoryResourceFile y ParameterResourceFile en EventSourceCreationData se utilizan para especificar las rutas a estos archivos de recursos.

Creando Fuentes de Eventos con PowerShell

También puedes crear fuentes de eventos usando PowerShell, lo que es útil para scripts de automatización y configuración del sistema. El cmdlet New-EventLog permite crear un nuevo registro de eventos, y New-EventSource permite crear una nueva fuente de eventos.

Para crear una fuente de eventos usando PowerShell, puedes usar el siguiente comando:

New-EventSource -LogName "Application" -Name "MiFuentePowerShell" 

Este comando creará una fuente de eventos llamada "MiFuentePowerShell" en el registro de "Aplicación". Puedes especificar un registro personalizado si lo deseas.

Preguntas Frecuentes (FAQs)

¿Necesito privilegios de administrador para crear una fuente de eventos?
Sí, se requieren privilegios administrativos para crear una fuente de eventos en Windows Vista y versiones posteriores. Esto se debe a que el sistema necesita acceder a todos los registros de eventos, incluyendo el registro de seguridad, para asegurar la unicidad de la fuente.
¿Puedo crear una fuente de eventos para un registro de eventos existente?
Sí, puedes crear una fuente de eventos para un registro de eventos existente (como "Aplicación" o "Sistema") o para un registro de eventos personalizado que crees.
¿Qué pasa si el nombre de la fuente de eventos ya existe?
El método CreateEventSource lanzará una excepción ArgumentException si intentas crear una fuente de eventos con un nombre que ya existe.
¿Puedo cambiar el registro de eventos asociado a una fuente después de crearla?
No se recomienda cambiar el registro de eventos asociado a una fuente después de crearla. Si necesitas cambiarlo, lo mejor es eliminar la fuente existente y crear una nueva con la configuración deseada. Ten en cuenta que esto podría requerir reiniciar el equipo para que los cambios surtan efecto completamente.
¿Cuál es la diferencia entre WriteEvent y WriteEntry?
WriteEvent está diseñado para escribir eventos localizados usando identificadores de recursos definidos en archivos de recursos. WriteEntry es más simple y se utiliza para escribir cadenas de texto directamente al registro de eventos.

Conclusión

Crear fuentes de eventos personalizadas es un paso crucial para implementar un registro de eventos efectivo en tus aplicaciones Windows. Utilizando la clase EventLog en .NET y el método CreateEventSource, puedes configurar fuentes de eventos que te permitan registrar información valiosa para el monitoreo, la depuración y el mantenimiento de tus aplicaciones. Recuerda crear las fuentes de eventos durante la instalación de tu aplicación y considerar el uso de fuentes de eventos localizadas para aplicaciones multi-idioma. Con una buena estrategia de registro de eventos, podrás obtener una mayor visibilidad del comportamiento de tus aplicaciones y resolver problemas de manera más eficiente.

Subir