Si nuestras aplicaciones registran información de excepciones o tracing en el EventLog, es probable que nos encontremos con que no estén funcionando cuando pasemos nuestras aplicaciones a producción.
La escritura de una entrada en el EventLog implica la existencia de una entrada en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application de la Registry. Por ejemplo las aplicaciones ASP.NET que corren en un ambiente de producción, se encuentran bajo un contexto de seguridad restringido, el cual no tiene privilegios de escritura en la Registry. Recordemos que en Windows 2003, las aplicaciones ASP.NET, por defecto corren bajo una cuenta Network Service Account, la cual no tiene acceso de escritura a la registry.
Tal como dijimos, la escritura de una entrada en el EventLog implica la existencia de una entrada en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application de la Registry que se corresponde con el nombre del “Source” que figura en la ventana que lo muestra.Ejemplo: Para Source = EjemploExcepciones

Debe existir la entrada:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\ EjemploExcepciones

El contenido del value EventMessageFile se corresponde con la librería que registra la entrada en el Event Log.
En el caso de .NET: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dllNótese que v2.0.50727 es la versión del .NET Framework con la que corre la aplicación que quiera registrar entradas en el Event Log para ese “Source”.
Solución
Asegurarse que la entrada que se corresponde con el nombre del “Source” exista en la registry. Para ello, recomiendo desarrollar una aplicación del tipo instalador para registrar el “Source”, la cual se ejecutará una sola vez al momento de instalar la aplicación.
Cree un proyecto del tipo Class Library (InstaladorRegistry.dll), e incluya una clase con el siguiente código. O incluya este código en el instalador de su aplicación:Imports System
Imports System.Configuration.Install
Imports System.Diagnostics
Imports System.ComponentModel<RunInstaller(True)> _
Public Class CustomEventLogInstaller
Inherits System.Configuration.Install.Installer
Private customEventLogInstaller As EventLogInstaller
Public Sub New()
MyBase.New()
'Registrar el Event Log Source = "MiAplicacionSource" para el log "Application"
customEventLogInstaller = New EventLogInstaller
customEventLogInstaller.Source = "MiAplicacionSource"
customEventLogInstaller.Log = "Application"
Installers.Add(customEventLogInstaller)
End Sub
Public Shared Sub Main()
End Sub
End ClassUtilizarla de la siguiente forma:
InstallUtil.exe InstaladorRegistry.dllObservemos el Log del proceso de instalación:
Instalando ensamblado 'c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.dll'.
Los parámetros afectados son: assemblypath = c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.dll
logfile = c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.InstallLog
Creando el origen de EventLog MiAplicacionSource en el registro Application...
Confirmando ensamblado 'c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.dll'.La misma cumple funciones de desinstalación:
InstallUtil.exe /u InstaladorRegistry.dllLog del proceso de desinstalación:
Desinstalando ensamblado ‘c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.dll'.
Los parámetros afectados son: assemblypath = c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.dll
logfile = c:\carlos walzer\architect\InstaladorRegistry\bin\InstaladorRegistry.InstallLog
Quitando el origen de EventLog MiAplicacionSource.
¡Importante!
Ya se habrán imaginado que todo este trabajo que hicimos es para NO dale permisos de escritura sobre la registry al usuario con el cual está corriendo la aplicación. Si bien es el camino más fácil, esto traería consecuencias de inseguridad para nuestro sistema.
Desestime el uso del EventLog
Expuesta la solución me gustaría darles mi punto de vista por el cual desestimar la escritura de información de Excepciones o Tracing en el EventLog:
- Como vieron, hay implicancias de seguridad que de no detectarse, harían que información valiosa se estuviera perdiendo.
- De la misma forma, se requieren permisos de Administrador para la lectura del eventLog mediante la aplicación EventViewer, lo cual deja afuera a muchos usuarios interesados en ella que no tienen estos privilegios en un ambiente de producción.
- Esta información está distribuida en cada servidor, y su recolección y centralización puede ser engorrosa.
- El EventLog tiene una capacidad máxima, y por defecto descarta la información mas antigua cuando llega a su tope, con lo cual estarían perdiendo información valiosa a la hora de investigar un problema.
- Si para salvar el punto anterior aumentan el tamaño del EventLog, verían afectado la performance de la aplicación. Un valor aceptable no debería superar los 10 Mb.
Otros mecanismos para reemplazar el EventLog
Existen otros mecanismos y librerías totalmente configurables y extensibles que fueron pensadas para el registro de información del tipo Excepciones o Tracing. Les recomiendo que adopten a su gusto cualquiera de estas dos herramientas las cuales me dieron muy buenos resultados: