2011-11-16 13 views
34

que han creado un programa de servicio de Windows y yo quiero que mi error estrictamente se escribirá en el eventLog de Windows. Así que he seguido estos pasos desde el artículo del proyecto de código:Anotación de eventos en un programa de servicio de Windows

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

Pero no veo ninguno de los mensajes de registro a medida que escribí en los registros de eventos creados en la ventana del visor de sucesos cuando puedo iniciar o detener el servicio . ¿Cómo especifico si el mensaje se debió a un error o simplemente es información?

Respuesta

57

En primer lugar, MSDN es su amigo. Asegúrate de revisar el enlace, ya que hay algunos posibles errores que vale la pena conocer.

En esencia, se crea un objeto EventLog:

this.ServiceName = "MyService"; 
this.EventLog = new System.Diagnostics.EventLog(); 
this.EventLog.Source = this.ServiceName; 
this.EventLog.Log = "Application"; 

También es necesario crear una fuente, si la fuente anterior no existe:

((ISupportInitialize)(this.EventLog)).BeginInit(); 
if (!EventLog.SourceExists(this.EventLog.Source)) 
{ 
    EventLog.CreateEventSource(this.EventLog.Source, this.EventLog.Log); 
} 
((ISupportInitialize)(this.EventLog)).EndInit(); 

y luego simplemente lo utilizan:

this.EventLog.WriteEntry("My Eventlog message.", EventLogEntryType.Information); 

en realidad es bastante simple.

+10

Tenga en cuenta que tendrá que tener permisos correctos a realidad crea el registro De lo contrario, obtendrá una excepción (como mínimo de Windows Server 2003) –

+1

Definitivamente, y eso se observa claramente en la documentación de MSDN. – alphadogg

+8

@alphadogg la propiedad de EventLog de una ServiceBase es de solo lectura. El código es incorrecto De manera predeterminada, el servicio de Windows basado en .NET escribirá el registro de eventos como "Aplicación", por lo que no necesita especificarlo manualmente. –

21

finalmente conseguí que esto funcione mediante la combinación de varias respuestas StackOverflow y desde MSDN.

Primero incluye los siguientes espacios de nombres

using System.ComponentModel; 
using System.Diagnostics; 

Luego de registro de instalación en su constructor

public UserService1() 
    { 
     //Setup Service 
     this.ServiceName = "MyService2"; 
     this.CanStop = true; 
     this.CanPauseAndContinue = true; 

     //Setup logging 
     this.AutoLog = false; 

     ((ISupportInitialize) this.EventLog).BeginInit(); 
     if (!EventLog.SourceExists(this.ServiceName)) 
     { 
      EventLog.CreateEventSource(this.ServiceName, "Application"); 
     } 
     ((ISupportInitialize) this.EventLog).EndInit(); 

     this.EventLog.Source = this.ServiceName; 
     this.EventLog.Log = "Application"; 
    } 

uso de la siguiente manera:

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 

     this.EventLog.WriteEntry("In OnStart"); 
    } 
Cuestiones relacionadas