EventViewer en 5 min

L’Event Viewer permet de visualier des erreurs ou des messages provenant du système ou d’applications. C’est un outil intéressant car il centralise tous les messages et que les messages sont facilement consultables.

Dans le cas d’une application qu’on développe et pour laquelle on souhaite indiquer des messages particuliers, l’event viewer peut être intéressant pour donner des indications à l’utilisateur. Il ne remplace par le fichier de log qui est adapté pour les messages de logs de grande taille, toutefois il peut s’avérer utile pour indiquer une erreur facilement consutable ou simplement informer sur le statut d’un processus.

Logger des messages de logs dans l’Event Viewer consomme de l’espace disque. Donc dans le cas où il est nécessaire de logger un grand nombre d’information, il est préférable de privilégier un fichier de log classique et de réserver l’Event Viewer à des messages plus importants.

Ouvrir l’Event Viewer

A partir du panneau de configuration (Control Panel):

  1. Système et sécurité (System and security)
  2. Outils d’administration (Administration tools)
  3. Observateur d’évènements (Event viewer)

A la ligne de commandes, on peut taper:

eventvwr.msc

Accéder aux logs

Dans l’Event viewer, les logs sont disponibles en dépliant les noeud “Windows Logs” et “Application and Services Logs”. Le noeud “Windows Logs” est composé de 5 catégories:

  • “Application”,
  • “Security”,
  • “Setup”,
  • “System” et
  • “Forwarded Events”.

On peut ajouter des logs dans la catégorie “Application” et dans un sous-élément du noeud “Application and Services Logs”.

Ajouter un message de log par programmation

La classe permettant de rajouter des messages de logs est System.Diagnostics.EventLog.

Plus de détails concernant EventLog sur MSDN.

Ajouter un message dans “Application”

Pour ajouter un message dans la catégorie “Application” du noeud “Windows Logs”, on peut exécuter le code suivant:

using System.Diagnostics; 
 
//... 
using (EventLog eventLog = new EventLog())  
{ 
    eventLog.Source = "CustomSource";  
    eventLog.WriteEntry("Message particulier", EventLogEntryType.Warning, 9); 
}

La source permet d’indiquer le nom de l’application d’où provient le message. En outre, il existe plusieurs niveaux de logs:

  • Information
  • SuccessAudit
  • Warning
  • FailureAudit
  • Error

Enfin le code "9" n’a pas de signication particulière. Il permet d’affecter un identifiant à un évènement de façon à facilement le rechercher par la suite.

L’inconvénient d’utiliser ce noeud est que les messages sont noyés avec tous les autres messages des autres applications.

Ajouter un message dans une catégorie particulière

Pour faciliter la recherche des messages de logs et avoir une catégorie particulière, il est possible de créer une source d’évènement particulière qui se trouvera dans le noeud “Applications and Services Logs”. On pourra alors rajouter tous ses messages directement dans cette source.

Créer une source

On peut créer une source qui se rajoutera sous “Applications and Services Logs” en exécutant:

try 
{ 
    if (!EventLog.SourceExists("CustomSource"))  
    {  
        EventLog.CreateEventSource("CustomSource", "CustomApplication");  
    } 
} 
catch (System.Security.SecurityException securityException) 
{ 
    // ... 
} 
catch (Exception occuredException) 
{ 
    // .... 
}

Ce code va créer une catégorie “CustomApplication” sous “Applications and Services Logs” et il sera possible de rajouter des logs en utilisant la source “CustomSource”.

Exécuter avec les droits administrateurs

Pour exécuter ce code, il faut lancer l’exécutable avec les droits administrateurs.
Dans le cadre d’application livrée, l’étape d’ajout d’une source d’évènement doit se faire à l’installation puisque, dans son fonctionnement normal, l’application ne sera pas exécutée avec les droits administrateurs.

Latence lors de l’ajout d’une catégorie

L’ajout d’une catégorie prend un certain temps. Si on utilise tout de suite la source après sa création, il peut y avoir une erreur à l’ajout d’un message de log car il n’a pas encore été ajouté.

Supprimer une source

A l’opposé, pour supprimer une source:

if (EventLog.SourceExists("CustomSource")) 
{ 
    EventLog.DeleteEventSource("CustomSource"); 
}

De la même façon, les droits administrateurs sont nécessaires pour exécuter ce code.

Création d’un message de log

Quand la source est créée, il n’est plus nécessaire d’exécuter l’application avec les droits administrateurs pour rajouter un message de log, le code est le même que précédemment:

using (EventLog eventLog = new EventLog()) 
{ 
    eventLog.Source = "CustomSource";
    eventLog.WriteEntry("Autre message particulier", EventLogEntryType.Error, 10); 
}

Contrairement au cas précédent, ce message sera rajouté dans la catégorie "CustomApplication" et avec le nom de source "CustomSource".

Effacer des messages de log

Il suffit d’exécuter le code suivant:

using (EventLog eventLog = new EventLog()) 
{ 
    eventLog.Source = "CustomSource";  
    eventLog.Clear(); 
}

Supprimer la catégorie

Il faut exécuter avec les droits administrateurs:

if (EventLog.Exists("CustomApplication")) 
{ 
    EventLog.Delete("CustomApplication"); 
}

A l’opposé de l’installation, c’est ce code qu’il faut exécuter à la désintallation de l’application.

Lire le contenu de l’Event Viewer par programmation

On peut lire le contenu d’une source en exécutant:

using (EventLog eventLog = new EventLog()) 
{ 
    eventLog.Log ="CustomApplication"; 
    foreach (EventLogEntry entry in eventLog.Entries) 
    { 
        Console.WriteLine(entry.Message); 
    } 
}

Ajouter des logs avec l’API Win32

Il est possible d’ajouter des logs en utilisant l’API Win32 sans avoir besoin des privilèges administrateurs. Il suffit de faire des appels P/Invoke sur les fonctions déclarées de la façon suivante:

[DllImport("advapi32.dll")] 
public static extern IntPtr RegisterEventSource(string lpUNCServerName, string lpSourceName); 
 
[DllImport("advapi32.dll")] 
public static extern bool DeregisterEventSource(IntPtr hEventLog); 
 
[DllImport("advapi32.dll", EntryPoint = "ReportEventW", CharSet = CharSet.Unicode)] 
public static extern bool ReportEvent(IntPtr hEventLog, ushort wType, 
  ushort wCategory, int dwEventID, IntPtr lpUserSid, ushort wNumStrings, 
  uint dwDataSize, string[] lpStrings, byte[] lpRawData); 
 
public const ushort EVENTLOG_INFORMATION_TYPE = 0x0004; 
public const ushort EVENTLOG_WARNING_TYPE = 0x0002; 
public const ushort EVENTLOG_ERROR_TYPE = 0x0001;

Plus de précisions sur la page suivante: Logging to the Windows EventLog without administrative privileges in .Net.

Leave a Reply