Ecrire dans le journal des evenements eventviewer

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 768 fois - Téléchargée 29 fois

Contenu du snippet

ce petit code a mettre dans un module peut etre tres pratique pour enregistrer des erreurs dans le journal des evenements de Windows (EventViewer) a partir de votre programme VB.
Cela peut servir via des outils de supervision à trapper des erreurs via l'ID de l'evenement par exemple.

Exemple d'utilisation :

Const IDEvent = 1111
NomSource = app.ExeName
Result = WriteToEventViewer("Mon message d'erreur", vbLogEventTypeError, IDEvent, NomSource)

Source / Exemple :


a mettre dans un module :

Option Explicit
Public Enum enmLogType
   LogError = 1&
   LogWarning = 2&
   LogInfo = 4&
End Enum

Public Enum enmErrLevel
   lInfo = &H60000000
   lWarning = &HA0000000
   lError = &HE0000000
End Enum

Private Declare Function RegisterEventSource Lib "advapi32" Alias "RegisterEventSourceA" (ByVal lpUNCServerName As String, ByVal lpSourceName As String) As Long
Private Declare Function DeregisterEventSource Lib "advapi32" (ByVal hEventLog As Long) As Long
Private Declare Function ReportEvent Lib "advapi32" Alias "ReportEventA" (ByVal hEventLog As Long, ByVal wType As Long, ByVal wCategory As Long, ByVal dwEventID As Long, ByVal lpUserSid As Long, ByVal wNumStrings As Long, ByVal dwDataSize As Long, lpStrings As Any, lpRawData As Any) As Long

Public Function WriteToEventViewer(sErrMsg As String, eEventType As LogEventTypeConstants, IDEvent As Integer, Optional sSourceName As String) As Boolean
    On Error Resume Next
    
    Dim lEventLogHwnd As Long
    Dim LogType As enmLogType
    Dim lEventID As Long
    Dim lCategory As Long
    Dim sServerName As String
    Dim lRet As Long
   
    WriteToEventViewer = True
    If sSourceName = "" Then sSourceName = App.EXEName
    lCategory = 0
    sServerName = vbNullString
            
    If eEventType = vbLogEventTypeError Then
        LogType = LogError
        lEventID = IDEvent Or enmErrLevel.lError
    ElseIf eEventType = vbLogEventTypeInformation Then
        LogType = LogInfo
        lEventID = IDEvent Or enmErrLevel.lInfo
    ElseIf eEventType = vbLogEventTypeWarning Then
        LogType = LogWarning
        lEventID = IDEvent Or enmErrLevel.lWarning
    End If
    
    lEventLogHwnd = RegisterEventSource(lpUNCServerName:=sServerName, lpSourceName:=sSourceName)
    
    If lEventLogHwnd = 0 Then
        WriteToEventViewer = False
        Exit Function
    End If
    
    lRet = ReportEvent(hEventLog:=lEventLogHwnd, wType:=LogType, wCategory:=lCategory, dwEventID:=lEventID, lpUserSid:=0, wNumStrings:=1, dwDataSize:=0, lpStrings:=sErrMsg, lpRawData:=0)
                       
    If lRet = False Then
        WriteToEventViewer = False
    End If
                       
    DeregisterEventSource lEventLogHwnd
End Function

Conclusion :


ATTENTION quand meme a ne pas polluer le journal des evenements avec trop d'enregistrements.

Vous pouvez bien entendu laisser vos commentaires et noter, cela fait toujours plaisir (ou pas, ça depend de votre gentillesse).

A voir également

Ajouter un commentaire

Commentaires

Messages postés
15
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
9 août 2007

J'ai posté dans la rubrique 'système' un code intitulé 'ECRIRE DANS LE JOURNAL DES EVENEMENTS (METHODE 3)'qui résous les problèmes évoqués. Il utilise une DLL (msgfile.dll) qui référence des messages libres numérotés de 0 à 9999. Je posterais un prochain code qui s'affranchira de la DLL.
Messages postés
521
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
11 septembre 2008
5
je viens de faire un test en ajoutant dans le registre le nom de mon appli sous la clé :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\ "Mon APPLI"
puis en ajoutant les clés :
TypesSupported = 7 (en DWORD)
et EventMessageFile = le chemin de mon EXE (en MULTI_SZ)

et cela ne fonctionne toujours pas en a toujours le message dans le log : "impossible de trouver ....."

Si quelqu'un a une solution testée et qui peut faire une description de ce qu'il faut mettre exactement dans le registre, je suis prenneur ?
Messages postés
521
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
11 septembre 2008
5
Le probleme d'ecrire dans le journal des evenements par WSH est que la source du message est WSH donc pas possiblité de savoir quel est le programme qui ecrit dans le journal (si on a deux programmes qui tourne sur la meme machine comment savoir lequel ?) c'est pour ça que j'utilise la methode par API.

merci a DrJo45 pour l'info, j'avais cherché un long moment sans trouvé, je vais regarder.

Apres de nombreux test (entre WSH et API), la solution la plus propre etait par API.
Messages postés
15
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
9 août 2007

En attendant de gérer les messages via une DLL, j'ai posté un code sous le nom 'ECRIRE DANS LE JOURNAL DES EVENEMENTS (METHODE 2)'. Il n'utilise pas d'API. Le nom de la source des messages n'est pas modifiable (WSH) et l'EventID est lié au type d'information (warning, info ,error).
Messages postés
16
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
23 juin 2006

Merci à JuanedaEr pour l'info.
A mon tour de donner un coup de main :
Cherchez Q166902 sur internet et vous saurez qu'il manque une entrée dans la base de registre pour que l'event viewer puisse afficher correctement l'application qui a loggé l'erreur.
(dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog)
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.