L'approche qui est mieux pour lire les journaux d'Événements de Windows en C#? WMI ou EventLog
J'ai besoin d'écrire une application pour saisir journal des événements du Système/Applications. L'autre exigence est que j'ai besoin de lire journal des événements à chaque minute ou deux afin de saisir les nouvelles des journaux d'événements depuis que j'ai lu la dernière fois.
Actuellement, je suis envisage d'utiliser le C# à mettre en œuvre au lieu de C++.
Avec ce que j'ai lu plusieurs pages web et, si je comprends bien, je peux utiliser WMI ou de Journal des événements de classe de lire un journal des événements.
Il me semble que j'ai peut être notifié lorsque le nouveau journal des événements est ajouté à l'aide du Journal des événements de la classe, mais je n'étais pas sûr que c'est mieux qu'à l'aide de WMI.
Si ma compréhension est correcte, je voudrais savoir quel chemin je dois prendre?
Merci de me donner quelques conseils. Merci.
OriginalL'auteur istudy0 | 2011-03-23
Vous devez vous connecter pour publier un commentaire.
WMI est de la merde. Il utilise des charges de la mémoire et les "événements" sont obtenus par l'interrogation en interne. Vous pouvez même définir l'intervalle d'interrogation. Vous êtes beaucoup mieux d'utiliser un Journal de classe .NET. Mais si vous avez besoin de lire tous les journaux à partir de Windows Vista+ vous devez utiliser le EventLogReader où vous pouvez lire les événements qui définissent les événements non par l'intermédiaire d'un fichier dll de message situé sous
mais il y a une ProviderGuid spécifié qui est inscrit ailleurs. De ce fait, il est impossible de lire les nombreux messages des systèmes d'exploitation qui utilisent le nouveau système. Mais vous pouvez utiliser le EventLogReader classe uniquement sur les machines avec une Version de l'OS >= Vista. Vous aurez besoin de deux cas de lecture du journal implémentations selon le système d'exploitation installé si vous avez besoin pour obtenir tous les messages.
La classe de Journal des événements peut également être fait assez rapidement quand vous lisez les messages en morceaux, par exemple, de 100 messages à partir de jusqu'à 4 threads qui permet d'améliorer la vitesse de lecture allant jusqu'à un facteur 2-3. J'ai eu les erreurs aléatoires pour le Journal des Événements de Sécurité sur Windows Server 2003 lorsque la lecture à partir de plusieurs threads, mais pour les autres ça a très bien fonctionné à partir de XP 32 Bits à Windows 7 x64.
OriginalL'auteur Alois Kraus
Je sais que c'est long après le post original, mais j'espère que c'est usefule pour les futurs chercheurs qui, comme moi, trouvé un Journal de classe trop lent. Voici un peu de code pour démontrer à la recherche pour le plus récent Système d'événements de démarrage:
Si vous voulez seulement de l'entrée la plus récente, ce code a pris de 0,28 secondes sur ma machine, par rapport à 7.11 secondes à l'aide d'un Journal de classe à la place de la boucle for ():
Espère que cela aide.
J'ai exécuté votre code pour un ordinateur distant en changeant le Journal des événements de constructeur par défaut de Journal des événements("sécurité","remoteMachineName","remoteIP"). Dans le débogueur j'ai vu que la machine distante a écrit près de 250000 entrées pour une seule journée. Et en boucle par tous les d'entre eux a pris 10 minutes de temps, Veuillez indiquer s'il existe une meilleure façon de boucle à distance par le biais emachine les journaux d'événements.
J'ai vu EventLogEntry Auditeurs..mais dans quelle mesure cela est possible et correct pour un ordinateur distant le Journal des événements. Vous demander de nous faire part de vos idées. Merci!
OriginalL'auteur Ian
Découvrez les classes dans l'espace de noms System.Diagnostics.Concours complet (et plus profond), plutôt que d'utiliser un Journal de classe.
Lors de l'accès à un ordinateur distant (peut-être juste Vista et version ultérieure) à l'aide d'un Journal de classe, l'ordinateur distant génère environ 6 audit de sécurité d'entrées que vous le connectez à des journaux, et une autre entrée ou 2 à chaque fois que vous récupérer un enregistrement de journal dans une boucle.
Mais avec le EventLogQuery /EventLogReader /EventLogWatcher vous pouvez créer un EventLogSession vous permet de rester connecté. Et vous pouvez récupérer des entrées spécifiques à l'aide d'une requête XPath alors que EventLog vous oblige à effectuer une itération sur toutes les entrées de trouver une entrée.
http://msdn.microsoft.com/en-us/library/bb671200.aspx
AVERTISSEMENT: Pour obtenir le message d'événement, la méthode EventLogRecord.FormatDescription() est hit-or-miss, et la propriété LevelDisplayName est aussi hit-or-miss. Pour cette raison, je suis en revenant à la classe de Journal des événements pour récupérer les entrées, et à l'aide de la EventLogWatcher pour regarder des entrées.
OriginalL'auteur AndyClaw