i need able retrieve event log entries hyper-v part of monitoring system use. @ moment use vbscript , wmi , like:
query = "select * win32_ntlogevent logfile = 'system' , timegenerated >= '" & last_check & "'" set wmi_objectset = wmi_service.execquery(query, "wql", &h30)
and works fine retrieves of hyper-v logs not all. googling suggests there no way round , ms have not built ability read hyper-v logs wmi. need different approach.
more googling found c# code reading event logs , fine happy use c# instead of vbscript. trouble while can read standard logs system , application can't work out how read hyper-v log want. code looks like:
eventlog = new eventlog(); eventlog.log = eventlogname; foreach (eventlogentry log in eventlog.entries) {
if set eventlogname "system" works , reads log entries (and it's impressively quick). need entries log microsoft-windows-hyper-v-vmms-admin. if set eventlogname "microsoft-windows-hyper-v-vmms-admin" exception:
unhandled exception: system.invalidoperationexception: event log 'microsoft-windows-hyper-v-vmms-admin' on computer '.' not exist.
the log exist, , powershell command:
get-winevent -logname microsoft-windows-hyper-v-vmms-admin
does retrieve events, problem presumably right way specify log name eventlog object.
so question use in c# program entries in hyper-v vmms admin log.
the server testing on 2012r2 though don't think problem related exact version of windows. there other ways of getting @ log data, get-winevent or wevtutil, prefer c# program work , using alternative method last resort.
this happens because system.diagnostics.eventlog
supports "old style" event logs. "new style" event logs see in event viewer under "applications , services logs" (and subfolders of that, not ones directly in it), , doesn't support reading those. read those, need use classes provided in system.diagnostics.eventing.reader
. note these have different interface geared more towards real-time event retrieval. sample code:
using (var reader = new eventlogreader("microsoft-windows-hyper-v-vmms-admin")) { eventrecord eventrecord; while ((eventrecord = reader.readevent()) != null) { console.writeline("{0:s} {1}", eventrecord.timecreated, eventrecord.formatdescription()); } }
if interested in latest events, it's more efficient query them in reverse order , filter them way. little enumerator helper can throw in linq:
ienumerable<eventrecord> readeventsreverse(string logname) { using ( var reader = new eventlogreader( new eventlogquery(logname, pathtype.logname) { reversedirection = true } ) ) { eventrecord eventrecord; while ((eventrecord = reader.readevent()) != null) { yield return eventrecord; } } }
and then
var reverseevents = readeventsreverse("microsoft-windows-hyper-v-vmms-admin"); var reverseeventstoday = reverseevents.takewhile(e => e.timecreated >= datetime.now.date); foreach (var eventrecord in reverseeventstoday) { console.writeline("{0:s} {1}", eventrecord.timecreated, eventrecord.formatdescription()); }
if you're interested in reading new events, it's more efficient use the overload allows supply bookmark you're not continuously re-reading , filtering old events.
Comments
Post a Comment