web-dev-qa-db-fra.com

Journalisation des événements dans un programme de service Windows

J'ai créé un programme de service Windows et je souhaite que mon erreur soit strictement écrite dans le journal des événements Windows. J'ai donc suivi ces étapes à partir de l'article de projet de code:

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

Mais je ne vois aucun des messages de journal personnalisés que j'ai écrits dans les journaux d'événements créés dans la fenêtre de l'observateur d'événements lorsque je démarre ou arrête le service. De plus, comment puis-je spécifier si le message est dû à une erreur ou s'il s'agit uniquement d'informations?

39
ArmenB

Tout d'abord, MSDN est votre ami. Assurez-vous de vérifier le lien, car il existe des problèmes potentiels à connaître.

Essentiellement, vous créez un objet EventLog:

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

Vous devez également créer une source, si la source ci-dessus n'existe pas:

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

puis utilisez-le simplement:

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

c'est en fait assez simple.

65
alphadogg

J'ai finalement réussi à faire fonctionner cela en combinant diverses réponses StackOverflow et MSDN.

Incluez d'abord les espaces de noms suivants

using System.ComponentModel;
using System.Diagnostics;

Ensuite, configurez la journalisation dans votre constructeur

    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";
    }

Utilisez comme suit:

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

        this.EventLog.WriteEntry("In OnStart");
    }
26
James Westgate