我正在开发一个显示事件日志数据的Web应用程序,类似于事件查看器.应用程序还必须为用户提供一种订阅事件日志的方法,并在使用Web服务将条目写入订阅日志时接收通知.
我正在使用此代码订阅Web服务中的事件日志:
EventLog eventLog = new EventLog(observer.logName, observer.machineName);
eventLog.EnableRaisingEvents = true;
eventLog.EntryWritten += new EntryWrittenEventHandler(eventLog_EntryWritten);
eventList.Add(eventLog);
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用观察者作为事件日志的订阅者,并且当处理EventWritten事件时,调用一个观察者的Update方法.问题是,我不知道如何区分事件日志,因为它们都使用相同的事件处理程序.我这样做是因为事件日志的数量因机器而异.此外,我希望观察者只处理一种类型的EventLog,即.当事件写入应用程序日志时,一个观察者将发送电子邮件.
我使用这行代码来获取当前计算机上的所有日志:
remoteEventLogs = EventLog.GetEventLogs(machineName);
Run Code Online (Sandbox Code Playgroud)
EventWritten事件处理程序具有此对象发送者参数,但Visual Studio将其类型显示为EventLogInternal,我无法使用它,并且我无法将发送者强制转换为EventLog以获取EventLog.Log属性.如果我尝试投射它,像这样:
void eventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
{
var log = (EventLog)sender;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,说我不能将EventLogInternal转换为EventLog.
有没有办法知道哪个EventLog会触发事件?
谢谢
小智 3
另一种选择是使用反射:
string log = (string)sender.GetType().GetProperty("Log").GetValue(sender, null);
Run Code Online (Sandbox Code Playgroud)
因为sender在这种情况下实际上拥有该Log财产。