我想在Windows事件查看器中将新日志条目添加到特定事件日志文件时引发事件。我正在尝试做类似于这里提到的事情。 http://msdn.microsoft.com/en-us/library/bb671202.aspx
这是我的代码:
static void Main()
{
EventLogWatcher watcher = null;
try
{
EventLogQuery eventQuery = new EventLogQuery("C:\\Windows\\System32\\winevt\\Logs\\Admin.evtx", PathType.FilePath);
EventLogReader logReader = new EventLogReader(eventQuery);
DisplayEventAndLogInformation(logReader);// this successfully opens the log and shows all logged events.
watcher = new EventLogWatcher(eventQuery);
watcher.EventRecordWritten +=
new EventHandler<EventRecordWrittenEventArgs>(SomeEvent);
watcher.Enabled = true; // here i get an unhandled exception which is as below:
} //exception handling omitted here for conciseness
public static void SomeEvent(Object obj, EventRecordWrittenEventArgs arg){}
public static void DisplayEventAndLogInformation(EventLogReader logReader){}
我无法使用PathType.LogName
,因为这不是标准的系统日志,并且在
HKLM /系统/ CurrentControlSet /服务/事件日志
。当我使用像“System”或“Application”这样的Logname时,此代码可以正常工作,但是当我使用相应的PathType.FilePath
时,它会失败。我希望它与PathType.FilePath
一起使用,并在每次将特定查询(此处未提及)输入日志时触发事件。关于为什么这段代码不起作用的任何输入都会很棒!
当DisplayEventAndLogInformation
方法完美地工作时,为什么我会收到“频道路径inavalid”错误?
异常消息:
System.Diagnostics.Eventing.Reader.EventLogException:指定的 渠道路径 是无效的 在System.Diagnostics.Eventing.Reader.EventLogException.Throw(Int32 错误代码 ) 在System.Diagnostics.Eventing.Reader.NativeWrapper.EvtSubscribe(EventLogHand) le session,SafeWaitHandle signalEvent,String path,String query,EventLogHandl e书签,IntPtr上下文,IntPtr回调,Int32标志) 在System.Diagnostics.Eventing.Reader.EventLogWatcher.StartSubscribing() 在System.Diagnostics.Eventing.Reader.EventLogWatcher.set_Enabled(布尔值 VAL UE) 在C:\ Users \ username \ documents \ visual studio中的eventlogreader.Program.Main() 2010 \ Projects \ eventlogreader \ eventlogreader \ Program.cs:第40行 在System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args ) 在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySec urity,String [] args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在System.Threading.ExecutionContext.RunInternal(ExecutionContext executionCo ntext,ContextCallback回调,对象状态,布尔保留SyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,C ontextCallback回调,对象状态,布尔保留SyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,C ontextCallback回调,对象状态) 在System.Threading.ThreadHelper.ThreadStart()